使用 dplyr 折叠重复的列

collapse duplicate columns with dplyr

我从电子表格中读取了以下数据。

structure(list(x = c("a", NA, NA, "b", NA, NA, "c", NA), y = c(1, 
   NA, NA, 7, NA, NA, 13, NA), z = c(2, NA, NA, 8, NA, NA, 14, NA
), x.1 = c(NA, "a", "a", NA, "b", "b", NA, "c"), y.1 = c(NA, 
3, 5, NA, 9, 11, NA, 15), z.1 = c(NA, 4, 6, NA, 10, 12, NA, 16
)), .Names = c("x", "y", "z", "x.1", "y.1", "z.1"), row.names = c(NA, 
-8L), class = "data.frame")

显示时是这样的:

     x  y  z  x.1 y.1 z.1
1    a  1  2 <NA>  NA  NA
2 <NA> NA NA    a   3   4
3 <NA> NA NA    a   5   6
4    b  7  8 <NA>  NA  NA
5 <NA> NA NA    b   9  10
6 <NA> NA NA    b  11  12
7    c 13 14 <NA>  NA  NA
8 <NA> NA NA    c  15  16

有时这些 3 组重复列中的一组以上。鉴于我不知道我将拥有多少个块,但我知道这些列都将以相同的方式命名,只是具有不同的(但按顺序递增的)数字后缀,我如何将所有数据组合到前 3 个列中?这可能与 dplyr 有关吗?

使用dplyr/tidyr

library(dplyr)
library(tidyr)
add_rownames(dfN) %>%
         gather(Var, Val, -1) %>% 
         mutate(Var=sub('\..*$', '', Var)) %>%
         na.omit() %>% 
         spread(Var, Val) %>%
         select(-rowname) 
#  x  y  z
#1 a  1  2
#2 a  3  4
#3 a  5  6
#4 b  7  8
#5 b  9 10
#6 b 11 12
#7 c 13 14
#8 c 15 16

或使用base R

dfN[c('x', 'y', 'z')] <- lapply(split(colnames(dfN), sub('\..*$', '', 
            colnames(dfN))), function(nm) 
                  do.call(pmax, c(dfN[nm], na.rm=TRUE)) )
dfN[1:3]

数据

dfN <- structure(list(x = c("a", NA, NA, "b", NA, NA, "c", NA),
y = c(1, 
 NA, NA, 7, NA, NA, 13, NA), z = c(2, NA, NA, 8, NA, NA, 14, NA
), x.1 = c(NA, "a", "a", NA, "b", "b", NA, "c"), y.1 = c(NA, 
 3, 5, NA, 9, 11, NA, 15), z.1 = c(NA, 4, 6, NA, 10, 12, NA, 16
)), .Names = c("x", "y", "z", "x.1", "y.1", "z.1"), row.names = c(NA, 
-8L), class = "data.frame")