【问题标题】:Extract data from a nested dataframe into the same record将嵌套数据框中的数据提取到同一记录中
【发布时间】:2022-01-06 09:37:12
【问题描述】:

我有这个主要的数据框:

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中数据的主数据框,但我不知道如何。

【问题讨论】:

  • 欢迎来到 SO!如果您提供最小可重复的示例,您将最大限度地获得有用的答案。 This post 可能会有所帮助。
  • 请说明您的“主要”data.frame 是什么(例如,它是列表中使用的data.frame 的类型还是列表中每个data.frame 的信息合并为一个数据。框架)。另外,考虑使用dput 创建示例data.frame。
  • @JKupzig 对写得不好的问题感到抱歉,我的主要数据框是“testdataframe”,里面是字段sensors_data 以及其他字段(对于这个例子只有ID)。我正在尝试提取示例中的数据

标签: r dataframe multidimensional-array pivot-table data-manipulation


【解决方案1】:

使用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]>

【讨论】:

  • 对不起,我的问题写得不好,但我的问题是sensors_data是主数据框“testdataframe”中的一个字段,我如何将函数映射到sensors_data字段?我应该先 unnest sensors_data 吗?
  • 查看我的编辑,您只需从数据框所在的列开始您的请求。
  • 好的,谢谢,最后一件事.. .x 在枢轴中更长的时间是什么?它对我不起作用,它说找不到对象
  • .x 允许调用 map 函数传递的元素。所以在这里,来自sensors_data 列的每个数据帧。将.x 替换为.,您应该得到相同的结果。一个完全整洁的解决方案是:map(~ .x %&gt;% select(type,value) %&gt;% tidyr::pivot_wider(names_from = type))
  • 确保您使用的是 purrr 包中的地图,例如通过purrr::map.
【解决方案2】:

我最喜欢的答案已经由 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

【讨论】:

    猜你喜欢
    • 2020-04-03
    • 2020-07-30
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 2021-06-17
    • 2021-11-06
    • 2016-01-25
    • 2021-05-09
    相关资源
    最近更新 更多