与dplyr中的'summarise'相反:将一行变成多行
Opposite of 'summarise' in dplyr: turn one row into many
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
请注意,data.frame与上图类似的情况可能出现在许多情况下,例如在处理大量数据时(出于内存效率的原因)。 this question.
中要求类似的功能
我知道有些解决方案不使用dplyr
,但我对使用它很感兴趣,因为我想对分组的 (group_by(a2)
) 数据子集执行此操作。
这目前看来是不可能的,但在 active discussion by the developers 下,目标版本为 0.5。
注意 data.table
目前允许这样做(请参阅@akrun 的评论),并且还允许您使用任意大小的组输入进行任意大小的组输出,而似乎正在与 [=13= 讨论解决方案] 将要求所有组的大小相同。这是一个例子:
> 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
,据我所知)。
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
请注意,data.frame与上图类似的情况可能出现在许多情况下,例如在处理大量数据时(出于内存效率的原因)。 this question.
中要求类似的功能我知道有些解决方案不使用dplyr
,但我对使用它很感兴趣,因为我想对分组的 (group_by(a2)
) 数据子集执行此操作。
这目前看来是不可能的,但在 active discussion by the developers 下,目标版本为 0.5。
注意 data.table
目前允许这样做(请参阅@akrun 的评论),并且还允许您使用任意大小的组输入进行任意大小的组输出,而似乎正在与 [=13= 讨论解决方案] 将要求所有组的大小相同。这是一个例子:
> 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
,据我所知)。