【发布时间】:2019-03-22 18:16:05
【问题描述】:
我正在寻求将for 循环转换为lapply 或类似函数的帮助。
我有一个类似data.frames 的list,每个都包含
- 一个指示列 ('a')
- 值列 ('b')
我想为每个数据框反转 b 列中的值,但仅限于特定指标。例如,反转 'b' 中所有在 a 列中指示符为 2 的值。
以下是一些示例数据:
x = data.frame(a = c(1, 2, 3, 2), b = (seq(from = .1, to = 1, by = .25)))
y = data.frame(a = c(1, 2, 3, 2), b = (seq(from = 1, to = .1, by = -.25)))
my_list <- list(x = , y = y)
my_list
$x
a b
1 1 0.10
2 2 0.35
3 3 0.60
4 2 0.85
$y
a b
1 1 1.00
2 2 0.75
3 3 0.50
4 2 0.25
我想要的输出如下所示:
my_list
$x
a b
1 1 0.10
2 2 0.65
3 3 0.60
4 2 0.15
$y
a b
1 1 1.00
2 2 0.25
3 3 0.50
4 2 0.75
我可以通过以下 for 循环实现所需的输出。
for(i in 1:length(my_list)){
my_list[[i]][my_list[[i]]['a'] == 2, 'b'] <-
1 - my_list[[i]][my_list[[i]]['a'] == 2, 'b']
}
但是。当我尝试将它卷成这样的 lapply 形式时:
invertfun <- function(inputDF){
inputDF[inputDF['a'] == 2, 'b'] <- 1 - inputDF[inputDF['a'] == 2, 'b']
}
resultList <- lapply(X = my_list, FUN = invertfun)
我得到一个只有反转值的列表:
resultList
$x
[1] 0.65 0.15
$y
[1] 0.25 0.75
我在这里缺少什么?我尝试应用(双关语)来自以下方面的见解:
how to use lapply instead of a for loop, to perform a calculation on a list of dataframes in R
如果有任何见解或替代解决方案,我将不胜感激。我正在尝试将我的 R 技能提升到一个新的水平,apply 和类似的功能似乎是关键。
【问题讨论】: