我有一个包含两列“a”和“B”的数据框,其中交替出现缺失值(NA)
NA
a b dog <NA> mouse <NA> <NA> cat bird <NA>
我想将它们“合并”/合并到一个新的列c中,如下所示,即每行中的非NA元素都被选中:
c dog mouse cat bird
我尝试了merge和join,但是都没有达到我的要求。也许是因为我没有一个id来合并?对于整数,我会绕过这个问题,把两列都加起来,但是在我的情况下怎么做呢?
merge
join
0pizxfdo1#
您可以尝试pmax
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
...或ifelse:df$c <- ifelse(is.na(df$a), df$b, df$a)对于多于两列的情况下的更一般的解决方案,您可以找到几种在R here中实现合并的方法。
ifelse
df$c <- ifelse(is.na(df$a), df$b, df$a)
d6kp6zgx2#
我为这种类型的任务编写了一个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
pw9qyyiw3#
dplyr正好有你要找的,函数coalesce()
dplyr
coalesce()
library(dplyr) a<-c("dog","mouse",NA,"bird") b<-c(NA,NA,"cat",NA) coalesce(a,b) [1] "dog" "mouse" "cat" "bird"
c6ubokkw4#
以下是我的尝试(由@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
mqkwyuun5#
另一个选项是将which与arr.ind=TRUE一起使用
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
或者
df$c <- df[cbind(1:nrow(df),max.col(!is.na(df)))]
cigdeys36#
您可以使用简单的apply:
apply
df$c <- apply(df,1,function(x) x[!is.na(x)] ) > df a b c 1 dog <NA> dog 2 mouse <NA> mouse 3 <NA> cat cat 4 bird <NA> bird
ajsxfq5m7#
使用if else逻辑:
a<-c("dog","mouse",NA,"bird") b<-c(NA,NA,"cat",NA) test.df <-data.frame(a,b, stringsAsFactors = FALSE) test.df$c <- ifelse(is.na(test.df$a), test.df$b, test.df$a) test.df a b c 1 dog <NA> dog 2 mouse <NA> mouse 3 <NA> cat cat 4 bird <NA> bird
7条答案
按热度按时间0pizxfdo1#
您可以尝试
pmax
...或
ifelse
:df$c <- ifelse(is.na(df$a), df$b, df$a)
对于多于两列的情况下的更一般的解决方案,您可以找到几种在R here中实现合并的方法。
d6kp6zgx2#
我为这种类型的任务编写了一个coalesce()函数,它的工作原理与SQL合并函数非常相似。
pw9qyyiw3#
dplyr
正好有你要找的,函数coalesce()
c6ubokkw4#
以下是我的尝试(由@MrFlick修改)
mqkwyuun5#
另一个选项是将
which
与arr.ind=TRUE
一起使用或者
cigdeys36#
您可以使用简单的
apply
:ajsxfq5m7#
使用if else逻辑: