【发布时间】:2021-07-17 16:07:28
【问题描述】:
编辑:我正在编辑我的原始问题,因为提供的解决方案可以完美运行,但不适用于我的数据框(在此示例和现实生活中),但我不知道为什么,所以我包括一个代表。
我最初的问题:我有许多列名相同的数据框(分光光度计数据),我想一次沿所有数据框的 单个 列应用一个函数,并附加每个数据框架与新列。该单列在数据帧中的名称相同。
我一直在尝试 lapply (并申请家庭),然后转到地图无济于事。这个解决方案看起来很有希望 (R - Apply function on multiple data frames),但是我在 lapply 函数中放置在位置 3 的所有内容都被忽略为未使用的参数。
我想通过对数据框列表中每个数据框的列 (colc) 应用计算来创建新列(冷列)。
这正是我需要的解决方案,但我无法让它在现实生活中发挥作用 - 我的代表如下
library(tidyverse)
sizes <- c(3, 3, 3)
dfs <- lapply(setNames(sizes, paste0("df", seq_along(sizes))),
function(n) data.frame(cola = sample(1:3, n, replace = T),
colb = sample(c("x", "y", "z"), n, replace = T),
colc = runif(n, 2, 10)))
calculation <- function(x){
b <- 20
abs <- log10(x/b)
return(abs)
}
dfs %>% map(~ .x %>% mutate(cold = calculation(colc)))
#> $df1
#> cola colb colc cold
#> 1 3 x 7.849806 -0.4061711
#> 2 1 z 2.570162 -0.8910696
#> 3 3 y 4.787902 -0.6208847
#>
#> $df2
#> cola colb colc cold
#> 1 3 z 9.408709 -0.3275000
#> 2 1 z 8.979679 -0.3477692
#> 3 2 x 4.256270 -0.6720008
#>
#> $df3
#> cola colb colc cold
#> 1 2 x 7.283048 -0.4387168
#> 2 2 x 9.513528 -0.3226884
#> 3 2 z 7.552567 -0.4229354
lapply(dfs, function(df) df %>% mutate(cold = calculation(colc)))
#> $df1
#> cola colb colc cold
#> 1 3 x 7.849806 -0.4061711
#> 2 1 z 2.570162 -0.8910696
#> 3 3 y 4.787902 -0.6208847
#>
#> $df2
#> cola colb colc cold
#> 1 3 z 9.408709 -0.3275000
#> 2 1 z 8.979679 -0.3477692
#> 3 2 x 4.256270 -0.6720008
#>
#> $df3
#> cola colb colc cold
#> 1 2 x 7.283048 -0.4387168
#> 2 2 x 9.513528 -0.3226884
#> 3 2 z 7.552567 -0.4229354
我的(缓慢的)数据框:
library(tidyverse)
cola <- c(1,2,3)
colb <- c("x","y","z")
colc <- c(1.4,1.2,2.5)
mydf1 <- as.data.frame(colb %>% cbind(cola, colc))
colc <- 1.1*colc # just to change content of same column name for df2
mydf2 <- as.data.frame(colb %>% cbind(cola, colc))
mydfs <- list(mydf1, mydf2)
calculation <- function(x){
b <- 20
abs <- log10(x/b)
return(abs)
}
mydfs %>% map(~ .x %>% mutate(cold = calculation(colc)))
#> Error: Problem with `mutate()` column `cold`.
#> ℹ `cold = calculation(colc)`.
#> x non-numeric argument to binary operator
lapply(mydfs, function(df) df %>% mutate(cold = calculation(colc)))
#> Error: Problem with `mutate()` column `cold`.
#> ℹ `cold = calculation(colc)`.
#> x non-numeric argument to binary operator
我知道这是一种创建数据帧的可怕方式,但它在现实生活中会产生与从 csv 文件导入的数据帧相同的错误。
【问题讨论】:
-
你想要一个函数,它需要一个 data.frame 和一个列名,并将这个函数应用于列表中的多个 data.frames?你的
calculation-function 只接受一个参数...