【问题标题】:Coalesce two string columns with alternating missing values to one将具有交替缺失值的两个字符串列合并为一个
【发布时间】:2015-03-07 04:06:02
【问题描述】:

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

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

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

c
dog
mouse
cat
bird

我尝试了mergejoin,但都没有达到我想要的效果。也许是因为我没有要合并的 id?对于整数,我会绕过这个并添加两列,但在我的情况下如何?

【问题讨论】:

  • 那些NA 值是真的还是假的?

标签: r na missing-data


【解决方案1】:

使用 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

【讨论】:

    【解决方案2】:

    dpyr 正是你要找的,函数coalesce()

    library(dplyr)
    
    a<-c("dog","mouse",NA,"bird")
    b<-c(NA,NA,"cat",NA)
    
    coalesce(a,b)
    
    [1] "dog"   "mouse" "cat"   "bird"
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        你可以试试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 &lt;- ifelse(is.na(df$a), df$b, df$a)

        对于多于两列的情况下更通用的解决方案,您可以找到几种在 R here 中实现合并的方法。

        【讨论】:

        • 对我来说最好的解决方案是使用ifelse 的第二个选项。谢谢
        【解决方案5】:

        另一种选择是将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)))]
        

        【讨论】:

          【解决方案6】:

          这是我的尝试(由@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
          

          【讨论】:

          • apply(df, 1, function(x) na.omit(x)[1]) 在这里工作不也一样,而且简单一点吗?
          • 我也会使用df[which(!is.na(df), arr.ind=TRUE)]
          • @akrun,这是非常好的矢量化方法。我会将其发布为您自己的答案
          【解决方案7】:

          我为这种类型的任务编写了一个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
          

          【讨论】:

            猜你喜欢
            • 2019-07-31
            • 2018-04-14
            • 1970-01-01
            • 1970-01-01
            • 2017-06-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多