【问题标题】:Go from wide dataframe to a dataframe with listcolumns从宽数据框转到带有列表列的数据框
【发布时间】:2017-02-12 13:13:53
【问题描述】:

我有一个 500Mb 的宽格式文件(132 列宽),其中六列是描述时间 1 到 16 的实例的变量(96 列),其中 36 列是不变的。我想更改数据结构,以便为每个实例提供一个列表列,并为不变的信息提供一个单独的列。时间实例的变量名称由以“1”结尾的名称唯一给出。

library(tidyverse)
a<-data_frame(id=c("A","B","C"),
              const82=c("1952","1960","1970"),
              const6=as.Date(today()-c(1:3)),
              var1=c(1:3),
              z21=c(letters[1:3]),
              o31=c(11:13),
              m41=c(LETTERS[11:13]),
              var2=c(4:6),
              z22=c(letters[4:6]),
              o32=c(20:22),
              m42=c(LETTERS[7:9]))

所以我尝试了:

gather(a, ... = dplyr::contains(ends_with("1"))) %>% nest(-id,-const81,-const6)

但我相信contains 没有矢量化,因此我无法遍历所有以“1”结尾的变量。此外,就像 Group_by 可用于嵌套的输入一样,我相信拥有一个“嵌套收集的列”的函数会很棒。

从tidyverse跳转到data.table,我可以

a_long<-melt(setDT(a), id=c("id","const82","const6"),
                 measure=patterns(c("^var\\d","^z2\\d","^o3\\d","^m4\\d")), 
                 value.name=vary<-c("var","z2","o3","m4"),
                 variable.name="num")%>%
 nest(... = num:m4,.key=instance)

这比我希望的要费力,但让我停下来。现在如果我想为常量变量添加另一个列表列,我不能再使用嵌套了。

a_long%>% nest(-id,-instance)
Error in grouped_indices_impl(groups$data, groups$groups) : 
  cannot group column instance, of class 'list'

所以-

  1. 我怎样才能轻松做到这一点?
  2. 我相信这些列表列会节省 Object 的内存,因为在数据帧中重复的信息更少 - 但确实如此吗?

所需的数据结构 - 但步骤似乎不必要地复杂:

a_long %>% select(1:3) %>% nest(-id,.key = const) %>% left_join(a_long) %>% select(-const82,-const6)

【问题讨论】:

  • 能否根据您的输入数据分享预期输出?

标签: r dplyr purrr


【解决方案1】:

这似乎有效

gather(a,variable,values,ends_with("1")) %>% nest(-id,-const82,-const6)
# # A tibble: 3 × 4
#      id const82     const6             data
#   <chr>   <chr>     <date>           <list>
# 1     A    1952 2017-04-08 <tibble [4 × 6]>
# 2     B    1960 2017-04-07 <tibble [4 × 6]>
# 3     C    1970 2017-04-06 <tibble [4 × 6]>

当你需要在 dplyr 函数中使用字符作为名称时,通常有一个_ 版本,比如gather_

a %>% gather_("variable", "values",str_subset(colnames(.),"1+$")) %>% 
  nest(-id,-const82,-const6)

【讨论】:

    猜你喜欢
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 2019-11-03
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 2013-08-15
    • 2020-09-13
    相关资源
    最近更新 更多