将一个大数据框进行合并

4

假设我创建了一个数据框 foo

foo <- data.frame(A=rep(NA,10),B=rep(NA,10))
foo$A[1:3] <- "A"
foo$B[6:10] <- "B"

看起来像是:

      A    B
1     A <NA>
2     A <NA>
3     A <NA>
4  <NA> <NA>
5  <NA> <NA>
6  <NA>    B
7  <NA>    B
8  <NA>    B
9  <NA>    B
10 <NA>    B

我可以将这个合并为一个单独的列,像这样:

coalesce

data.frame(AB = coalesce(foo$A, foo$B))

提供,

     AB
1     A
2     A
3     A
4  <NA>
5  <NA>
6     B
7     B
8     B
9     B
10    B

这很好。现在,假设我的数据框非常大,有很多列。如果不需要逐个命名每个列,如何使用coalesce函数?就我所知,coalesce期望向量,因此我没有看到一个整洁的dplyr解决方案,可以轻松地挑出所需的列并将它们一起传递。有什么想法吗?
编辑
按要求提供一个“更难”的示例。
foo <- data.frame(A=rep(NA,10),B=rep(NA,10),C=rep(NA,10),D=rep(NA,10),E=rep(NA,10),F=rep(NA,10),G=rep(NA,10),H=rep(NA,10),I=rep(NA,10),J=rep(NA,10))
foo$A[1] <- "A"
foo$B[2] <- "B"
foo$C[3] <- "C"
foo$D[4] <- "D"
foo$E[5] <- "E"
foo$F[6] <- "F"
foo$G[7] <- "G"
foo$H[8] <- "H"
foo$I[9] <- "I"
foo$J[10] <- "J"

如何在不写下面这段代码的情况下对此进行合并:

data.frame(ALL= coalesce(foo$A, foo$B, foo$C, foo$D, foo$E, foo$F, foo$G, foo$H, foo$I, foo$J))

你能提供一个更难的可重现案例吗?解决方案将取决于你的数据如何排列。 - alistaire
并不完全是这样,因为它本质上只是我给出的那个案例,但有很多列。然而,一个重要的点是,每一列中的值之间没有重叠的情况。也就是说,没有包含A和B等值的行。但是,就像上面的例子一样,有些行没有值(例如第4行和第5行)。 - Dan
让我来重新表述一下:你必须使用可重现的最小示例进行编辑,以便回答你的问题。你已经有了一个可工作的示例,这使得它不具有代表性。 - alistaire
2个回答

4
您可以使用do.call(coalesce, ...),这是一种更简单的方式来编写带有许多参数的函数调用:
library(dplyr)
do.call(coalesce, foo)
# [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J"

2
您可以使用这个(purrr: pmap的文档)。
coalesce(!!!foo)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接