在R 中,如何将单行的数据框或数组展开为多行?

编程语言 2026-07-10

我想这有点奇怪的问题,但我想在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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章