我有以下根据
构建的数据集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中执行此操作?我会采取任何我能得到的解决方案,只是好奇。
答案 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