将嵌套数据框中的数据提取到同一记录中

Extract data from a nested dataframe into the same record

我有这个主数据框:

testdataframe
       id     sensors_data
       <chr>  <list>
    1  AA     <data.frame [6 × 4]>              
    2  BB     <data.frame [6 × 4]>

sensors_data 的每个数据帧如下所示:

         id type  value           status
      <chr><chr>  <dbl>           <int>
1   SN01TP  a     25.800          1
2   SN01HU  b     40.000          1
3   SN02VD  c     1.146           1
4   SN02C2  d     1270.000        1
5   SY01DS  e     31.000          1
6   TD01TP  f     22.500          1

我希望我的主要数据框是这样的,而不仅仅是 sensors_data

   a      b       c      d         e       f
1  25.800 40.000  1.146  1270.000  31.000  22.500

我试过取消嵌套主数据框,但这会为每个字段创建一条记录。我正在尝试的是改变主数据框以访问 sensors_data 中的数据,但我不知道该怎么做。

使用purrr:maptidyr::pivot_wider,你可以做到这一点。如果你想要一个数据帧,请使用 bind_rows

df$pivoted <- df$sensors_data %>% 
  map(~ tidyr::pivot_wider(.[,c("type","value")], names_from = type))

df$pivoted
[[1]]
      a     b     c     d     e     f
1  25.8    40  1.15  1270    31  22.5

[[2]]
      a     b     c     d     e     f
1  25.8    40  1.15  1270    31  22.5

df
# A tibble: 2 x 3
  id    sensors_data pivoted         
  <chr> <list>       <list>          
1 AA    <df [6 x 4]> <tibble [1 x 6]>
2 BB    <df [6 x 4]> <tibble [1 x 6]>

或者,bind_rowsbind_cols

df$sensors_data %>% 
  map(~ tidyr::pivot_wider(.[,c("type","value")], names_from = type)) %>% 
  bind_rows() %>% 
  bind_cols(df,.)

# A tibble: 2 x 8
  id    sensors_data     a     b     c     d     e     f
  <chr> <list>       <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 AA    <df [6 x 4]>  25.8    40  1.15  1270    31  22.5
2 BB    <df [6 x 4]>  25.8    40  1.15  1270    31  22.5

数据:

df1 <- read.table(header = T, text="         id type  value           status
1   SN01TP  a     25.800          1
2   SN01HU  b     40.000          1
3   SN02VD  c     1.146           1
4   SN02C2  d     1270.000        1
5   SY01DS  e     31.000          1
6   TD01TP  f     22.500          1")

df <- tibble(id = c("AA", "BB"), sensors_data = list(df1,df1))
> df
  id    sensors_data
1 AA    <df [6 x 4]>
2 BB    <df [6 x 4]>

Maël 已经提供了我最喜欢的答案! 这是使用 lapply

的替代方法
library(dplyr)
library(tidyr)

sensors_data_sub <- lapply(sensors_data, function(x)x[,2:3])

sensors_data_sub_wide <- lapply(1:length(sensors_data_sub), 
                  function(x) (pivot_wider(sensors_data_sub[[x]], names_from = type, values_from = value)))

bind_rows(sensors_data_sub_wide)
      a     b     c     d     e     f
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1  25.8    40  1.15  1270    31  22.5
2  25.8    40  1.15  1270    31  22.5