我有一个数据框,有两列"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)
我试过merge和join,但既不工作,因为我想要的.也许是因为我没有合并的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)
你可以试试 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中实现合并的方法.
我为这种类型的任务编写了一个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)
这是我的尝试(由@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)
另一种选择是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)