创建新的列数据框并起作用:施加过多的变量

时间:2019-07-13 12:11:33

标签: r function dataframe lapply

我目前正在尝试编写一个简单的自定义函数,该函数基于两个现有列的乘积在现有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)。这样的一列,我无法创建。

2 个答案:

答案 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(., `*`)))