r - 尝试将多个列与 mapply 组合会创建巨大的列表



在编程方面,我是一个菜鸟,如果这是一个愚蠢的问题,我会忍耐。

我有一个数据帧,我想在其中将多对列组合成具有新名称的新列。

为此,我有三个向量,两个包含我要合并的每个列的名称,另一个包含新列的名称

假设我们有

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 个变量。

这是怎么回事?我的应用方法有问题吗?还是我只是在上面扔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"))

你可以使用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

最新更新