r - 与 dplyr : turn one row into many 中的 'summarise' 相反

标签 r dplyr

dplyr中是否有与summarise相反的功能,即将一行变成多行?

让我们考虑一个如下所示的 data.frame:

> testdf <- data.frame(a=c(1,1,2,2), b=c(1,2,1,2))
> testdf <- data.frame(a1=c(1,1,2,2), a2=c(1,2,1,2))
> testdf$a3 <- replicate(4, rnorm(3), simplify = F)
> testdf
  a1 a2                                a3
1  1  1 -0.6264538, 0.1836433, -0.8356286
2  1  2  1.5952808, 0.3295078, -0.8204684
3  2  1   0.4874291, 0.7383247, 0.5757814
4  2  2  -0.3053884, 1.5117812, 0.3898432

我现在想把它变成一个 data.frame 有 4*3=12 行,其中每个单元格中的每个值都是原子的。换句话说,我想扩展 a3 列。结果应如下所示:

> resdf
   a1 a2         a3
1   1  1 -0.6264538
2   1  1  0.1836433
3   1  1 -0.8356286
4   1  2  1.5952808
5   1  2  0.3295078
6   1  2 -0.8204684
7   2  1  0.4874291
8   2  1  0.7383247
9   2  1  0.5757814
10  2  2 -0.3053884
11  2  2  1.5117812
12  2  2  0.3898432

请注意,与上图类似的数据帧可能出现在许多情况下,例如在处理大量数据时(出于内存效率的原因)。 this question 中要求类似的功能.

我知道有些解决方案不使用dplyr,但我对使用它很感兴趣,因为我想为分组 (group_by(a2) ) 数据子集。

最佳答案

这目前看来是不可能的,但在 active discussion by the developers 目标版本为 0.5。

注意 data.table 目前允许这样做(请参阅@akrun 的评论),并且还允许您使用任意大小的组输入进行任意大小的组输出,而解决方案似乎正在与 dplyr 将要求所有组的大小相同。这是一个例子:

> data.table(a=1:3)[, paste(a, seq(a), sep=":"), by=a]
   a  V1
1: 1 1:1
2: 2 2:1
3: 2 2:2
4: 3 3:1
5: 3 3:2
6: 3 3:3

此外,根据@AlexBrown 的评论,您可以:

unnest(testdf, a3)

对于您的特定示例,但由于上述原因,这似乎不适用于 group_by/summarize 工作流程(即您无法创建 testdf 直接使用 dplyr::group_by,AFAIK)。

关于r - 与 dplyr : turn one row into many 中的 'summarise' 相反,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28049208/

相关文章:

R 转换 tibbles 列表的数据类型

r - 如何使用 R 复制数据帧的每个子组的第一行?

r - 具有可变列名的函数

根据 R 中另一个数据帧中给出的条件,用 NA 替换数据帧中的多个值

r - 为什么不存在的 data.frame 列中的项目分配有效?

r - 在ggplot2和facet_wrap中,如何删除所有边距和内边距,同时保留strip.text?

r - dplyr可以使用向量修改spark DF的多列吗?

r - 使用循环时的 tbl_df 和 data.frame 差异

r - 发送到多个函数的命名省略参数的通用方式

r - 通过具有任意函数的非整数因子聚合栅格