【发布时间】:2020-12-27 22:05:09
【问题描述】:
我有一个列表列表(2 个 df)并想使用 lapply 为每个 df 中的预定义列执行相同的功能。
我特别想使用 DescTools 包中的 winsorize 函数。目前我知道如何通过在 function(x) 命令中指定所有单独的列来做到这一点,但是,如果我有很多列,这会很乏味(参见示例)。
应用该函数后,应返回包含转换后变量的整个列表列表(所有列)。理想情况下,转换后的变量使用“_w”(例如“price_w”)或类似名称进行扩展,以表明这些是经过优化的变量。
我的数据如下所示,尽管我只想将该函数应用于预定义的“价格”和“质量”列。
id <- c(1, 5, 7, 9, 12)
country <- c("A", "A", "C", "E", "E")
price <- c(2.1, 4.6, 3.7, 2.9, 1.8)
quality <- c(3.1, 5.2, 3.3, 1.7, 0.9)
df1 <- cbind.data.frame(id, country, price, quality)
id <- c(2, 3, 4, 10, 14)
country <- c("F", "F", "A", "Z", "X")
price <- c(1.8, 5.2, 2.9, 4.6, 3.9)
quality <- c(4.3, 2.5, 6.9, 1.9, 0.8)
df2 <- cbind.data.frame(id, country, price, quality)
my.list <- list(df1, df2)
cols <- c("price", "quality")
这是我目前所拥有的,由于必要的手动更改,它仅适用于少数列:
my.list <- lapply(my.list, function(x) {
x$price_w <- DescTools::Winsorize(x$price, probs = c(.01, .99), na.rm = TRUE)
x$quality_w <- DescTools::Winsorize(x$quality, probs = c(.01, .99), na.rm = TRUE)
return(x)
})
【问题讨论】: