Я ищу помощь для преобразования цикла for
в lapply
или аналогичную функцию.
У меня есть list
подобных data.frame
с, каждый из которых содержит
- столбец индикатора ('a')
- столбец значения ('b')
Я хочу инвертировать значения в столбце b для каждого фрейма данных, но только для конкретных индикаторов.Например, инвертируйте все значения в 'b', которые имеют показатель 2 в столбце a.
Вот некоторые примеры данных:
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(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']
}
НО.Когда я пытаюсь свернуть это в форму счастья следующим образом:
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
Чего мне здесь не хватает?Я пытался применить (каламбур) выводы из:
как использовать lapply вместо цикла for, чтобы выполнить вычисление списка кадров данных в R
Буду признателен за любые идеи или альтернативные решения.Я пытаюсь поднять свои навыки R на следующий уровень, и apply
и подобные функции, похоже, являются ключевыми.