如何从存储在使用 tidyr 包构建的数据框中的列表中获取特定元素和子元素?
How to get specific elements and subelements from lists stored inside a data frame built with tidyr package?
我正在对数据框的每个组进行分段线性回归。为此,我使用了 segmented
和 tidyr
包。我的主要 objective 是使用分段线性回归(斜率、截距和 R²)的所有数据构建另一个数据框
到目前为止,我已经能够对 R² 和截距执行此操作。然而,斜坡是最困难的部分,这就是为什么我在这里寻求你的帮助。 segmented
包提供的结果是列表的形式,最复杂的列表恰恰是斜率列表,如下(在MWE中我介绍了这个列表是如何构建的.这里仅供说明):
> Segmented.values$slopes
$x
Est. St.Err. t value CI(95%).l CI(95%).u
slope1 1.00 0.10206 9.7980 0.56086 1.43910
slope2 -0.05 0.10206 -0.4899 -0.48914 0.38914
$x
Est. St.Err. t value CI(95%).l CI(95%).u
slope1 2.00 0.061237 32.6600 1.73650 2.26350
slope2 -0.05 0.061237 -0.8165 -0.31348 0.21348
从这个列表中,我只想获取列 Est.
的值,但尽管我进行了尝试,但我无法做到这一点。我的例子:
library(segmented)
library(tidyr)
library(dplyr)
Group <- c("A", "B")
x <- 0:5
y <- c(0, 1, 2, 2.1, 2.3, 2,
0, 2, 4, 4.5, 4.3, 4.4)
df <- expand.grid(x = x,
Group = Group)
df$y <- y
Segmented.values <- df %>%
nest_by(Group) %>%
mutate(my.lm = list(lm(data = data,
formula = y ~ x)),
my.seg = list(segmented(my.lm,
seg.Z = ~ x)),
intercepts = list(intercept(my.seg)),
slopes = list(slope(my.seg)),
R2 = list(summary(my.seg)$r.squared)) %>%
unnest(c(intercepts,
slopes,
R2)) %>%
select(-data,
-my.lm,
-my.seg,
-intercepts,
-R2) %>%
unnest_wider(slopes,
names_sep = " ")
结果是包含所有坡度数据的 table,但我只需要名为 slopes 1
和 slopes 2
的列(或 Est.
列包含这些值的列表)
> Segmented.values
# A tibble: 2 x 11
# Groups: Group [2]
Group `slopes 1` `slopes 2` `slopes 3` `slopes 4` `slopes 5` `slopes 6` `slopes 7` `slopes 8` `slopes 9` `slopes 10`
<fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 A 1 -0.05 0.102 0.102 9.80 -0.490 0.561 -0.489 1.44 0.389
2 B 2 -0.05 0.0612 0.0612 32.7 -0.816 1.74 -0.313 2.26 0.213
slopes
列除了 'Est.' 之外还有许多列,即如果我们提取列表元素之一
Est. St.Err. t value CI(95%).l CI(95%).u
slope1 1.00 0.10206 9.7980 0.56086 1.43910
slope2 -0.05 0.10206 -0.4899 -0.48914 0.38914
在执行 unnest_wider
之前,我们只能提取 'Est.'
library(dplyr)
library(purrr)
library(tidyr)
library(segmented)
df %>%
nest_by(Group) %>%
transmute(my.lm = list(lm(data = data,
formula = y ~ x)),
my.seg = list(segmented(my.lm,
seg.Z = ~ x)),
intercepts = list(intercept(my.seg)),
slopes = list(slope(my.seg)),
R2 = list(summary(my.seg)$r.squared)) %>%
ungroup %>%
select(Group, slopes) %>%
unnest(slopes) %>%
mutate(slopes = map(slopes, ~ .x[, "Est."])) %>% # get the 'Est.' column
unnest_wider(slopes)
-输出
# A tibble: 2 x 3
Group slope1 slope2
<fct> <dbl> <dbl>
1 A 1 -0.05
2 B 2 -0.05
我正在对数据框的每个组进行分段线性回归。为此,我使用了 segmented
和 tidyr
包。我的主要 objective 是使用分段线性回归(斜率、截距和 R²)的所有数据构建另一个数据框
到目前为止,我已经能够对 R² 和截距执行此操作。然而,斜坡是最困难的部分,这就是为什么我在这里寻求你的帮助。 segmented
包提供的结果是列表的形式,最复杂的列表恰恰是斜率列表,如下(在MWE中我介绍了这个列表是如何构建的.这里仅供说明):
> Segmented.values$slopes
$x
Est. St.Err. t value CI(95%).l CI(95%).u
slope1 1.00 0.10206 9.7980 0.56086 1.43910
slope2 -0.05 0.10206 -0.4899 -0.48914 0.38914
$x
Est. St.Err. t value CI(95%).l CI(95%).u
slope1 2.00 0.061237 32.6600 1.73650 2.26350
slope2 -0.05 0.061237 -0.8165 -0.31348 0.21348
从这个列表中,我只想获取列 Est.
的值,但尽管我进行了尝试,但我无法做到这一点。我的例子:
library(segmented)
library(tidyr)
library(dplyr)
Group <- c("A", "B")
x <- 0:5
y <- c(0, 1, 2, 2.1, 2.3, 2,
0, 2, 4, 4.5, 4.3, 4.4)
df <- expand.grid(x = x,
Group = Group)
df$y <- y
Segmented.values <- df %>%
nest_by(Group) %>%
mutate(my.lm = list(lm(data = data,
formula = y ~ x)),
my.seg = list(segmented(my.lm,
seg.Z = ~ x)),
intercepts = list(intercept(my.seg)),
slopes = list(slope(my.seg)),
R2 = list(summary(my.seg)$r.squared)) %>%
unnest(c(intercepts,
slopes,
R2)) %>%
select(-data,
-my.lm,
-my.seg,
-intercepts,
-R2) %>%
unnest_wider(slopes,
names_sep = " ")
结果是包含所有坡度数据的 table,但我只需要名为 slopes 1
和 slopes 2
的列(或 Est.
列包含这些值的列表)
> Segmented.values
# A tibble: 2 x 11
# Groups: Group [2]
Group `slopes 1` `slopes 2` `slopes 3` `slopes 4` `slopes 5` `slopes 6` `slopes 7` `slopes 8` `slopes 9` `slopes 10`
<fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 A 1 -0.05 0.102 0.102 9.80 -0.490 0.561 -0.489 1.44 0.389
2 B 2 -0.05 0.0612 0.0612 32.7 -0.816 1.74 -0.313 2.26 0.213
slopes
列除了 'Est.' 之外还有许多列,即如果我们提取列表元素之一
Est. St.Err. t value CI(95%).l CI(95%).u
slope1 1.00 0.10206 9.7980 0.56086 1.43910
slope2 -0.05 0.10206 -0.4899 -0.48914 0.38914
在执行 unnest_wider
library(dplyr)
library(purrr)
library(tidyr)
library(segmented)
df %>%
nest_by(Group) %>%
transmute(my.lm = list(lm(data = data,
formula = y ~ x)),
my.seg = list(segmented(my.lm,
seg.Z = ~ x)),
intercepts = list(intercept(my.seg)),
slopes = list(slope(my.seg)),
R2 = list(summary(my.seg)$r.squared)) %>%
ungroup %>%
select(Group, slopes) %>%
unnest(slopes) %>%
mutate(slopes = map(slopes, ~ .x[, "Est."])) %>% # get the 'Est.' column
unnest_wider(slopes)
-输出
# A tibble: 2 x 3
Group slope1 slope2
<fct> <dbl> <dbl>
1 A 1 -0.05
2 B 2 -0.05