根据 R 中的特定条件将两列中的值组合在一起



我有如下所示的数据:

moo <- data.frame(Farm = c("A","B",NA,NA,"A","B"), 
                  Barn_Yard = c("A","A",NA,"A",NA,"B"), 
                  stringsAsFactors=FALSE)
print(moo)
Farm Barn_Yard
 A         A
 B         A
<NA>      <NA>
<NA>       A
 A       <NA>
 B         B

我正在尝试将列合并为一个变量,如果它们相同,则结果产生在两列中找到的内容,如果两者都有数据,则结果是Farm列中的内容,如果两者都<NA>则结果为<NA>,如果一个有值而另一个没有,则结果是具有该值的列中存在的值。 因此,在这种情况下,结果将是:

oink <- data.frame(Animal_House = c("A","B",NA,"A","A","B"), 
                   stringsAsFactors = FALSE)
print(oink)
Animal_House
        A
        B
     <NA>
        A
        A
        B

我已经尝试了tidyrunite功能,但它并没有完全给我想要的东西。 有什么想法吗? 谢谢!

dplyr::coalesce正是这样做的,将第一个向量中的任何NA值替换为第二个向量中的值:

library(dplyr)
moo <- data.frame(Farm = c("A","B",NA,NA,"A","B"), 
                  Barn_Yard = c("A","A",NA,"A",NA,"B"), 
                  stringsAsFactors = FALSE)
oink <- moo %>% mutate(Animal_House = coalesce(Farm, Barn_Yard))
oink
#>   Farm Barn_Yard Animal_House
#> 1    A         A            A
#> 2    B         A            B
#> 3 <NA>      <NA>         <NA>
#> 4 <NA>         A            A
#> 5    A      <NA>            A
#> 6    B         B            B

如果要放弃原始列,请使用 transmute 而不是 mutate

一个不太简洁的选项是使用几个ifelse()语句,但如果您希望在组合中引入另一个条件或列,这可能很有用。

moo <- data.frame(Farm = c("A","B",NA,NA,"A","B"), 
                  Barn_Yard = c("A","A",NA,"A",NA,"B"), 
                  stringsAsFactors = FALSE)
moo$Animal_House = with(moo,ifelse(is.na(Farm) & is.na(Barn_Yard),NA,
                                   ifelse(!is.na(Barn_Yard) & is.na(Farm),Barn_Yard,
                                          Farm)))

最新更新