尝试将多个列与mapply结合使用会创建大量列表

时间:2019-04-25 07:30:46

标签: r mapply

在编程和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"))

1 个答案:

答案 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