如何从存储在使用 tidyr 包构建的数据框中的列表中获取特定元素和子元素?

How to get specific elements and subelements from lists stored inside a data frame built with tidyr package?

我正在对数据框的每个组进行分段线性回归。为此,我使用了 segmentedtidyr 包。我的主要 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 1slopes 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