gpt4 book ai didi

R lapply 用于列表列表以将相同的函数应用于预定义的列

转载 作者:行者123 更新时间:2023-12-03 15:34:41 25 4
gpt4 key购买 nike

我有一个列表列表(2 个 df)并想使用 lapply对每个 df 中的预定义列执行相同的功能。
我特别想使用 DescTools 中的 winsorize 函数包裹。目前我知道如何通过在 function(x) 命令中指定所有单独的列来做到这一点,但是,如果我有很多列,这很乏味(参见示例)。
应用该函数后,应返回带有转换变量的整个列表列表(所有列)。理想情况下,转换后的变量用“_w”(例如“price_w”)或类似的形式扩展,以表明这些是 winsorized 变量。
我的数据如下所示,尽管我只想将该函数应用于预定义的列“价格”和“质量”。

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)
})

最佳答案

我们可以使用嵌套 lapply将函数应用于每个列表中的多列。

lapply(my.list, function(x) {
x[paste0(cols, '_w')] <- lapply(x[cols], DescTools::Winsorize)
x
})

#[[1]]
# id country price quality price_w quality_w
#1 1 A 2.1 3.1 2.10 3.10
#2 5 A 4.6 5.2 4.42 4.82
#3 7 C 3.7 3.3 3.70 3.30
#4 9 E 2.9 1.7 2.90 1.70
#5 12 E 1.8 0.9 1.86 1.06

#[[2]]
# id country price quality price_w quality_w
#1 2 F 1.8 4.3 2.02 4.30
#2 3 F 5.2 2.5 5.08 2.50
#3 4 A 2.9 6.9 2.90 6.38
#4 10 Z 4.6 1.9 4.60 1.90
#5 14 X 3.9 0.8 3.90 1.02

关于R lapply 用于列表列表以将相同的函数应用于预定义的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63812216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com