将两 factor/character 列合并为一列

Merging two factor/character columns into one column

我有以下从

构建的数据集
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 中也有办法做到这一点吗?我会采取任何我能得到的解决方案,只是好奇。

我在您的 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

感兴趣

如果你想使用 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 hack:

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   

这是另一种从 help

中提取非 NAs 值的方法
t(help)[t(!is.na(help))]
## [1] "red"      "lightred" "blue"     "lightred" "red"      "orange"  

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

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

 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