我有一个具有相同列名的数据框架列表。我想遍历这些数据框,对其中一列进行一些更改,然后将该更改应用到原始数据框。我知道这样做通过迭代是不理想的,所以如果有更好的方法使用lapply,请告诉我!
df <- list(
'2020-01-01' = data.frame(value = c(3,5,7,8),
wt = c(1,1,1,1)),
'2020-02-01' = data.frame(value = c(90,90,98,91),
wt = c(1,1,1,1)),
'2020-03-01' = data.frame(value = c(0,10,3,8),
wt = c(1,1,1,1)))
for(i in df){
data <- data.frame(
val = i$value,
wt = i$wt) %>%
mutate(wt = ifelse(val > 95 | val < 5, 100, 1))
# mutation works within the loop
print(data)
# But this bit does nothing
i = data
}
print(df)
看起来i = data
什么都没做。但是如果我在循环外做同样的事情,用特定的数据帧替换i
:df$'2020-01-01'
它工作得很好:
data <- data.frame(val = df$`2020-01-01`$value,
wt = df$`2020-01-01`$wt) %>%
mutate(wt = ifelse(val > 95 | val < 5, 100, 1))
df$`2020-01-01` = data
df
使用lapply
或purrr::map
您可以:
library(dplyr)
df <- lapply(df, function(x) mutate(x, wt = if_else(value > 95 | value < 5, 100, 1)))
df
#> $`2020-01-01`
#> value wt
#> 1 3 100
#> 2 5 1
#> 3 7 1
#> 4 8 1
#>
#> $`2020-02-01`
#> value wt
#> 1 90 1
#> 2 90 1
#> 3 98 100
#> 4 91 1
#>
#> $`2020-03-01`
#> value wt
#> 1 0 100
#> 2 10 1
#> 3 3 100
#> 4 8 1