我目前正在尝试编写一个简单的自定义函数,该函数基于两个现有列的乘积在现有data.frame中创建一个新列。
然后我想使用lapply在全局环境中的多个data.frames上应用该功能。
但是,由于遇到以下错误(基于下面发布的示例数据),我已经无法编写自定义函数:“在[<-.data.frame
(*tmp*
中,i,value = list( A = 1:20,B = c(1L,:提供3个变量来替换2个变量“
我知道这是一个绝对的基本问题,但是我没有在网上找到对此特定问题的合适答案,只能自己把头缠住。
在此先感谢您的帮助!
我已经尝试过在函数末尾使用“ return(x [i])”(如在其他帖子中所建议的那样),或者也忽略了[i](我只看到了该用法)这是另一个问题),它没有改变任何内容。
使用此功能会出现上述错误
set.seed(40)
A <- seq(1:20)
B <- rbinom(A, 1, 0.5)
df1 <- data.frame(A, B)
set.seed(40)
C <- as.numeric(seq(1:50))
D <- as.numeric(rbinom(C, 1, 0.5))
df2 <- data.frame(C, D)
FUN = function(x, i){
x[i]$Mul = x[i]$A*x[i]$B
}
FUN(df1)
此函数正确提供了新值,但当然不会在现有data.frame中创建新列
FUN = function(x, i){
x[i]$A*x[i]$B
}
FUN(df1)
然后我想将该功能应用于名称为“ df”的所有其他data.frames
lapply(mget(ls(pattern="df")), FUN)
我希望在df中有一个新列df $ Mul,其值为c(1 2 3 0 0 0 0 0 8 0 0 0 12 0 0 15 16 0 18 0 20)。这样的一列,我无法创建。
答案 0 :(得分:0)
您可以使用mget
list_df <- mget(ls(pattern="df"))
使用transform
FUN = function(x){
transform(x, mult = x[, 1] * x[, 2])
}
并将其应用于数据框列表
list_df <- lapply(list_df, FUN)
您将拥有所有带有新列的数据框。虽然,最好将此类数据框保留在列表中,而不是在全局环境中具有多个数据框的对象。但是,如果您想再次单独使用数据帧,则可以
list2env(list_df,envir=.GlobalEnv)
答案 1 :(得分:0)
我们可以使用tidyverse
方法
library(tidyverse)
mget(ls(pattern = "^df\\d+$")) %>%
map(~ .x %>%
mutate(mult = (!! rlang::sym(names(.x)[1])) *
(!! rlang::sym(names(.x)[2]))))
或使用reduce
mget(ls(pattern = "^df\\d+$")) %>%
map(~ .x %>%
mutate(mult = reduce(., `*`)))