在编程和R方面,我有点菜鸟,如果这是一个愚蠢的问题,请多多包涵。
我有一个数据框,其中我想将多对列组合成一个具有新名称的新列。
为此,我有三个向量,两个向量包含要合并的每个列的名称,另一个包含新列的名称
说我们有
df <- data.frame("col_a" = c("value", NA , "value", "value"),
"col_b" = c("value", "value", NA, NA),
"col_c" = c(NA, "value", NA, NA),
"col__d" = c(NA, NA, "value", "value"))
然后使用上述向量
vec_new <- c("col_e", "col_f")
vec_1 <- c("col_a", "col_b")
vec_2 <- c("col_c", "col_d")
我考虑过使用这样的功能
fun <- function (x, y, z){mutate(df, x = coalesce(y, z))}
然后像这样使用mapply在我的数据帧上使用它
df_new <- mapply(fun, x= vec_new, y= vec_1, z= vec_2)
我期望的是基本上从col_a和col_c建立一个名为col_e的新列,然后在vec_1和vec_2中每隔两对,当我手动为一对这样的对时这样做
df_new <- mutate(df, col_e = coalesce(col_a, col_c))
但是,我得到的是一个列表,当我将其转换为数据框时
df_new_2 <- as.data.frame(df_new)
给我col_e和col_f作为列,将旧列作为行
如果在实际的数据帧上使用它,我的变量将从大约800个增加到120000个以上。
这是怎么回事?我的mapply方法有什么问题吗?或者我只是通过在其上抛出as.data.frame而犯了一个愚蠢的错误?
非常感谢您提供任何提示!
编辑: 我所期望的就是这样
df_new <- data.frame("col_e" = c("value", "value", "value", "value"),
"col_f" = c("value", "value", "value", "value"),
"col_a" = c("value", NA , "value", "value"),
"col_b" = c("value", "value", NA, NA),
"col_c" = c(NA, "value", NA, NA),
"col__d" = c(NA, NA, "value", "value"))
答案 0 :(得分:1)
您可以使用mapply
df[vec_new] <- mapply(function(x, y) dplyr::coalesce(df[[x]], df[[y]]), vec_1, vec_2)
df
# col_a col_b col_c col_d col_e col_f
#1 value value <NA> <NA> value value
#2 <NA> value value <NA> value value
#3 value <NA> <NA> value value value
#4 value <NA> <NA> value value value