在R 中,如何将单行的数据框或数组展开为多行?
我想这有点奇怪的问题,但我想在R 语言中把一行数据“展开”出来,如下所示。原始数据是,例如,一个数据框的行,其中v1 = 1,v2 = 2,如下所示:
collapsed = structure(list(v1 = 1L, v2 = 2L, v3 = 3L, v4 = 4L, v5 = 5L), class = "data.frame", row.names = c(NA,
-1L))
我希望最终结果看起来是这样的:
uncollapsed = structure(list(v1 = c(1L, 1L, 1L, 1L, 1L), v2 = c(NA, 2L, 2L,
2L, 2L), v3 = c(NA, NA, 3L, 3L, 3L), v4 = c(NA, NA, NA, 4L, 4L
), v5 = c(NA, NA, NA, NA, 5L)), class = "data.frame", row.names = c(NA,
-5L))
有一些包,比如collapse和 tidyr,提供用于折叠数据的函数,但我找不到执行相反操作的函数。我现在正在用一个循环来创建这个“未折叠”的数据框。想知道是否有更好的方法,因为我的实际工作流涉及数十亿行数据。
解决方案
你的数据中没有折叠信息,因此展开并不直观。
但使用 base R,我们可以通过 matrix 来模拟你想要的行为
doMat <- \(x) {
mat <- matrix(x, nrow = length(x), ncol = length(x), byrow = TRUE)
mat[upper.tri(mat)] <- NA
colnames(mat) <- names(x)
data.frame(mat)
}
doMat(collapsed)
v1 v2 v3 v4 v5
1 1 NA NA NA NA
2 1 2 NA NA NA
3 1 2 3 NA NA
4 1 2 3 4 NA
5 1 2 3 4 5
如果你不明确需要对 data.frame 进行类型转换,可以省略。并且,你不必把输入限定为data.frame,向量就足够了。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。