将具有交替缺失值的两个字符串列合并为一个

ben*_*ron 9 r

我有一个数据框,有两列"a"和"b",交替缺失值(NA)

a      b
dog    <NA>
mouse  <NA>
<NA>   cat
bird   <NA>
Run Code Online (Sandbox Code Playgroud)

我想"合并"/将它们组合到一个看起来像这样的新列c,即NA每行中的非元素被选中:

c
dog
mouse
cat
bird
Run Code Online (Sandbox Code Playgroud)

我试过mergejoin,但既不工作,因为我想要的.也许是因为我没有合并的id?对于整数,我只是绕过这个并添加两列,但在我的情况下如何?

小智 11

dplyr正是您正在寻找的功能coalesce()

library(dplyr)

a<-c("dog","mouse",NA,"bird")
b<-c(NA,NA,"cat",NA)

coalesce(a,b)

[1] "dog"   "mouse" "cat"   "bird"
Run Code Online (Sandbox Code Playgroud)


Hen*_*rik 8

你可以试试 pmax

df$c <- pmax(df$a, df$b)
df
#       a    b     c
# 1   dog <NA>   dog
# 2 mouse <NA> mouse
# 3  <NA>  cat   cat
# 4  bird <NA>  bird
Run Code Online (Sandbox Code Playgroud)

......或者ifelse:

df$c <- ifelse(is.na(df$a), df$b, df$a)

对于具有两列以上列的情况下的更一般的解决方案,您可以在此处找到几种在R中实现合并的方法.


MrF*_*ick 6

我为这种类型的任务编写了一个coalesce()函数,它的工作方式与 SQL 合并函数非常相似。你会像这样使用它

dd<-read.table(text="a      b
dog    NA
mouse  NA
NA   cat
bird   NA", header=T)

dd$c <- with(dd, coalesce(a,b))
dd
#       a    b     c
# 1   dog <NA>   dog
# 2 mouse <NA> mouse
# 3  <NA>  cat   cat
# 4  bird <NA>  bird
Run Code Online (Sandbox Code Playgroud)


Dav*_*urg 5

这是我的尝试(由@MrFlick修改)

df$c <- apply(df, 1, function(x) na.omit(x)[1])
df
#       a    b     c
# 1   dog <NA>   dog
# 2 mouse <NA> mouse
# 3  <NA>  cat   cat
# 4  bird <NA>  bird
Run Code Online (Sandbox Code Playgroud)


akr*_*run 5

另一种选择是which使用arr.ind=TRUE

indx <- which(!is.na(df), arr.ind=TRUE)
df$c <-  df[indx][order(indx[,1])]
df
#    a    b     c
#1   dog <NA>   dog
#2 mouse <NA> mouse
#3  <NA>  cat   cat
#4  bird <NA>  bird
Run Code Online (Sandbox Code Playgroud)

或者

df$c <- df[cbind(1:nrow(df),max.col(!is.na(df)))]
Run Code Online (Sandbox Code Playgroud)