我有一个数据集,每个主题的差异列中都包含相同的变量。我想将它们合并到相同的列。
例如:我有这个数据框,并且有三个DV,但是它们在不同主题的不同列(A,B,C)中。
data.frame(ID = c(1,2,3), DV1_A=c(1,NA,NA), DV1_B= c(NA,4,NA), DV1_C = c(NA,NA,5), DV2_A=c(3,NA,NA), DV2_B=c(NA,3,NA), DV2_C=c(NA,NA,5), FACT = c("A","B","C"))
如何将它们合并为仅两列?所以结果是:
data.frame(ID = c(1,2,3), DV1_A=c(1,NA,NA), DV1_B= c(NA,4,NA), DV1_C = c(NA,NA,5), DV2_A=c(3,NA,NA), DV2_B=c(NA,3,NA), DV2_C=c(NA,NA,5), FACT = c("A","B","C"), DV_1 = c(1,4,5), DV_2 = c(3,3,5))
最佳答案
您可以使用coalesce
中的dplyr
:
library(dplyr)
df %>%
mutate(DV_1 = coalesce(DV1_A, DV1_B, DV1_C),
DV_2 = coalesce(DV2_A, DV2_B, DV2_C))
如果要合并许多
DV
列,则可能不想键入所有列名。在这种情况下,您可以首先grep
每个DV
的列名,使用rlang::syms
将每个名称解析为符号,然后拼接(!!!
)coalesce
中的符号(@hadley的建议):library(rlang)
var_quo1 = syms(grep("DV1", names(df), value = TRUE))
var_quo2 = syms(grep("DV2", names(df), value = TRUE))
df %>%
mutate(DV_1 = coalesce(!!! var_quo1),
DV_2 = coalesce(!!! var_quo2))
如果相反,您有一吨
DV
,您甚至可能不想键入所有的coalesce
行,在这种情况下,您可以创建一个函数,该函数在给定输入数字的情况下输出一个DV
列,并将lapply
+ bind_col
一起全部输出:DV_combine = function(num_DVs){
DV_name = sym(paste0("DV", num_DVs))
DV_syms = syms(grep(paste0("DV", num_DVs), names(df), value = TRUE))
df %>%
transmute(!!DV_name := coalesce(!!! DV_syms))
}
bind_cols(df, lapply(1:2, DV_combine))
结果:
ID DV1_A DV1_B DV1_C DV2_A DV2_B DV2_C FACT DV_1 DV_2
1 1 1 NA NA 3 NA NA A 1 3
2 2 NA 4 NA NA 3 NA B 4 3
3 3 NA NA 5 NA NA 5 C 5 5
注意:
此方法适用于
numeric
和character
类列,但不适用于factor
。在使用此方法之前,应先将factor
列转换为字符。数据:
df = structure(list(ID = c(1, 2, 3), DV1_A = c(1, NA, NA), DV1_B = c(NA,
4, NA), DV1_C = c(NA, NA, 5), DV2_A = c(3, NA, NA), DV2_B = c(NA,
3, NA), DV2_C = c(NA, NA, 5), FACT = structure(1:3, .Label = c("A",
"B", "C"), class = "factor")), .Names = c("ID", "DV1_A", "DV1_B",
"DV1_C", "DV2_A", "DV2_B", "DV2_C", "FACT"), row.names = c(NA,
-3L), class = "data.frame")
关于r - 合并R中的多个变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47271093/