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

cczfrluj  于 2023-01-28  发布在  其他
关注(0)|答案(7)|浏览(373)

我有一个包含两列“a”和“B”的数据框,其中交替出现缺失值(NA

a      b
dog    <NA>
mouse  <NA>
<NA>   cat
bird   <NA>

我想将它们“合并”/合并到一个新的列c中,如下所示,即每行中的非NA元素都被选中:

c
dog
mouse
cat
bird

我尝试了mergejoin,但是都没有达到我的要求。也许是因为我没有一个id来合并?对于整数,我会绕过这个问题,把两列都加起来,但是在我的情况下怎么做呢?

0pizxfdo

0pizxfdo1#

您可以尝试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中实现合并的方法。

d6kp6zgx

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
pw9qyyiw

pw9qyyiw3#

dplyr正好有你要找的,函数coalesce()

library(dplyr)

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

coalesce(a,b)

[1] "dog"   "mouse" "cat"   "bird"
c6ubokkw

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
mqkwyuun

mqkwyuun5#

另一个选项是将whicharr.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)))]
cigdeys3

cigdeys36#

您可以使用简单的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
ajsxfq5m

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

相关问题