将两 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
中提取非 NA
s 值的方法
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
我有以下从
构建的数据集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
NA
s 值的方法
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