2017-03-10 59 views
1

有没有方法合并columes与NA值?合并列值为NA

例如

a <- data.frame(x1 = c("a", NA, NA), y1 = c(NA, "e1", NA), z1 = c("g", NA, "i"), x2 = c(NA, "b", NA), y2 = c("d", "e2", "f"), z2 = c(NA, "h", NA), x3 = c(NA, NA, "c")) 

x1 y1 z1 x2 y2 z2 x3 
1 a <NA> g <NA> d <NA> <NA> 
2 <NA> e1 <NA> b e2 h <NA> 
3 <NA> <NA> i <NA> f <NA> c 

所需的输出是

 x  y z 
1 a  d g 
2 b e1 e2 h 
3 c  f i 

回答

0

您可以使用is.naifelse改造NA为空字符串,然后用paste合并列,使用trimws,除去开头和结尾的空格:

a <- data.frame(x1 = c("a", NA, NA), y1 = c(NA, "e1", NA), z1 = c("g", NA, "i"), x2 = c(NA, "b", NA), y2 = c("d", "e2", "f"), z2 = c(NA, "h", NA), x3 = c(NA, NA, "c"), 
       stringsAsFactors = FALSE) 
a2 <- lapply(a, function(x) ifelse(is.na(x),"",x)) 
data.frame(x=trimws(paste(a2$x1,a2$x2,a2$x3)), 
       y=trimws(paste(a2$y1,a2$y2)), 
       z=trimws(paste(a2$z1,a2$z2))) 
    x  y z 
1 a  d g 
2 b e1 e2 h 
3 c  f i 
+0

工作很完美。谢谢!! – Scott

0

下面是使用dplyrreshape2另一种方式:

library(reshape2) 
library(dplyr) 
melt(as.matrix(a)) %>% 
    filter(!is.na(value)) %>% 
    group_by(Var1, g=substr(Var2, 1, 1)) %>% 
    summarise(value=paste(value, collapse=" ")) %>% 
    dcast(Var1 ~ g, value.var="value") %>% 
    select(-Var1)