[英]How do I loop through several dataframes and variables in a nested loop to change values of variables to missing in R
我有几个具有类似变量的数据帧,我想循环(示例中的变量“a”和“c”),以便将某些值(-1、9、98)更改为缺失值(NA)。 我想通过一个嵌套循环来实现这一点,方法是将数据帧放在一个列表中,并将我想要循环的变量名放在一个向量中。
df1 <- data.frame(a = c(-1, 1, 0, 3), b = c(4, 9, 0, -1), c = c(2, 0, 98, -1), d = c(3, 4, 3, 0))
df2 <- data.frame(a = c(3, 4, -1, 98), b = c(1, 3, 2, 9), c = c(9, -1, 0, 2), d = c(1, 4, 0, -1))
df3 <- data.frame(a = c(2, 4, 3, -1), b = c(9, 98, 0, 2), c = c(1, 2, -1, 1), d = c(3, 3, 0, 1))
df4 <- data.frame(a = c(-1, -1, 0, 0), b = c(4, -1, 9, 0), c = c(9, -1, 2, 0), d = c(1, -1, 2, 0))
dfs <- list(df1, df2, df3, df4)
vars <- c("a", "c")
for(i in dfs) {
for(x in vars) {
i %>% replace_with_na(replace = list(x = c(-1, 9, 98)))
}
}
我在想像上面提到的代码。 replace_with_na
取自naniar
package。
在最后一步中,我想再次从列表中提取数据帧(我还没有找到如何做)。
感谢您的任何建议!
您可以在此任务上使用tidyverse
方法:
library(dplyr)
library(purrr)
dfs %>%
map(~mutate(.x, across(vars, ~ifelse(.x %in% c(-1, 9, 98), NA, .x))))
这返回
[[1]]
a b c d
1 NA 4 2 3
2 1 9 0 4
3 0 0 NA 3
4 3 -1 NA 0
[[2]]
a b c d
1 3 1 NA 1
2 4 3 NA 4
3 NA 2 0 0
4 NA 9 2 -1
[[3]]
a b c d
1 2 9 1 3
2 4 98 2 3
3 3 0 NA 0
4 NA 2 1 1
[[4]]
a b c d
1 NA 4 NA 1
2 NA -1 NA -1
3 0 9 2 2
4 0 0 0 0
我采用与 Martin Gal 相同的 tidyverse 方法。 要提取回数据帧,您需要将 map 的map
分配给 dfs,然后执行
dfs %>% walk2(seq_along(dfs), ~assign(paste0("df",.y), .x, envir = .GlobalEnv))
或者,只需在map
调用walk2
之后调用 walk2。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.