将两个因子/字符列合并为一列

时间:2015-09-30 20:05:27

标签: r dplyr tidy

我有以下根据

构建的数据集
help <- data.frame(var1 = c("red", NA, NA, NA, "red", "orange"),
               var2 = c(NA, "lightred", "blue", "lightred", NA, NA))

    var1     var2
1    red     <NA>
2   <NA> lightred
3   <NA>     blue
4   <NA> lightred
5    red     <NA>
6 orange     <NA>

我不得不尝试创建一个新变量newvar,它只是将因子变量合并到一个新列中。我希望得到如下输出

    var1     var2   newvar
1    red     <NA>    red
2   <NA> lightred    lightred
3   <NA>     blue    blue
4   <NA> lightred    lightred
5    red     <NA>    red
6 orange     <NA>    orange

这是基于其他线程的尝试

help$newvar = ifelse(help$var1 == "", help$var2, help$var1)

当变量是因子时,newvar是数字,这是有道理的,但只有来自var1的变量才会转移到newvar。字符时,只有var1中的字符移动到newvar

我知道有人问过类似的问题,但答案似乎没有解决这个问题。 Merge two factor columns in R

有没有办法在dplyr中执行此操作?我会采取任何我能得到的解决方案,只是好奇。

4 个答案:

答案 0 :(得分:3)

我在var1中看不到任何空白,我看到缺少值。使用is.na(help$var1)代替help$var1 == ""

您还希望转换为角色,因为您有不同级别的因素。

help$newvar = ifelse(is.na(help$var1), as.character(help$var2), as.character(help$var1))

当然你可以使用dplyr,你只是创建一个列

help = mutate(help, newvar = ifelse(is.na(var1), as.character(var2), as.character(var1)))

在SQL中,此操作称为 coalesce 。您可能对How to implement coalesce efficiently in R

感兴趣

答案 1 :(得分:3)

如果你想使用tidyr:

library(tidyr)

help[] <- lapply(help, as.character)
help[is.na(help)] <- ''
unite(help, new, var1:var2, sep='', remove=F)

#       new   var1     var2
#1      red    red         
#2 lightred        lightred
#3     blue            blue
#4 lightred        lightred
#5      red    red         
#6   orange orange      

或基地R黑客:

transform(help, new = gsub('NA','',do.call(paste0, help))

#    var1     var2      new
#1    red     <NA>      red
#2   <NA> lightred lightred
#3   <NA>     blue     blue
#4   <NA> lightred lightred
#5    red     <NA>      red
#6 orange     <NA>   orange   

答案 2 :(得分:2)

以下是从NA

中对非help s值进行子集化的另一种方法
t(help)[t(!is.na(help))]
## [1] "red"      "lightred" "blue"     "lightred" "red"      "orange"  

t中的需求是因为R中的子集是按列而不是按行完成的

答案 3 :(得分:1)

在这种情况下,sqldf包可以派上用场,正如Gregor指出的那样,函数可以合并:

 library(sqldf)
 help$newvar <- sqldf("select coalesce(var1, var2) newvar from help")

输出:

    var1     var2   newvar
1    red     <NA>      red
2   <NA> lightred lightred
3   <NA>     blue     blue
4   <NA> lightred lightred
5    red     <NA>      red
6 orange     <NA>   orange