尝试将多列与 mapply 组合会创建巨大的列表
Trying to combine multiple columns with mapply creates enormous list
在编程和 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 和 [=50] 中构建一个名为 col_e 的新列=],它确实如此,当我像这样为一对手动执行此操作时
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"))
你可以使用 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
在编程和 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 和 [=50] 中构建一个名为 col_e 的新列=],它确实如此,当我像这样为一对手动执行此操作时
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"))
你可以使用 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