R将几个单元连接成一个而没有得到NA

时间:2017-07-24 09:01:19

标签: r merge na

我已经浏览了一些关于stackflow的问题,但我不太了解许多复杂的解决方案,我刚刚在两周前开始研究。这是一个示例data.frame:

#rm(list = ls()) 
A= c(1,2,3)
B= c("Africa", "Asia", NA)
C= c("Tiger", "Bear", "Dog")

df =  data.frame(A, B, C, stringsAsFactors=FALSE)


  A      B     C             
1 1 Africa Tiger    
2 2   Asia  Bear    
3 3   <NA>   Dog    

我想合并我的列,看起来像这样:

A= c(1,2,3)
B= c("Africa", "Asia", NA)
C= c("Tiger", "Bear", "Dog")
D= c("1AfricaTiger", "2AsiaBear", "3Dog")
Howitshouldlook = data.frame(A, B, C, D, stringsAsFactors = FALSE)



  A      B     C            D
  1 Africa Tiger 1AfricaTiger
  2   Asia  Bear    2AsiaBear
  3   <NA>   Dog         3Dog

我尝试的是:

df$D <- with(df, paste(df$A, df$B, df$C))

遗憾的是结果

  A      B     C              D
  1 Africa Tiger 1 Africa Tiger
  2   Asia  Bear    2 Asia Bear
  3   <NA>   Dog       3 NA Dog

我已经读过NA通常是一个问题,但我似乎没有找到一个简单的解决方案。有人可以将我链接到初学者和#39;解决方案或者向我解释如何在没有&#34; NA&#34;的情况下合并细胞。以及没有空白?

非常感谢! 斯蒂菲

3 个答案:

答案 0 :(得分:2)

您可以尝试此代码

test<- function(str){
  ifelse(is.na(str), "", str)
}

df$D <- with(df, paste0(test(df$A), test(df$B), test(df$C)))

它提供此输出

> df
  A      B     C            D
1 1 Africa Tiger 1AfricaTiger
2 2   Asia  Bear    2AsiaBear
3 3   <NA>   Dog         3Dog

答案 1 :(得分:2)

replace函数可用于整个data.frame:

do.call(paste0, replace(df, is.na(df), ""))
#[1] "1AfricaTiger" "2AsiaBear"    "3Dog"

答案 2 :(得分:0)

> data.frame(df, D=apply(df, 1, function(x) paste(na.omit(x),collapse="") ))
  A      B     C        D
1 1 Africa Tiger 1AfricaTiger
2 2   Asia  Bear    2AsiaBear
3 3   <NA>   Dog         3Dog