我想在R中循环一个数据帧名称的向量。下面是我想要做的大致。最后一个代码块并不是很有效。我试过把"j“放在括号里,使用get()和paste0()的组合,但还没有成功。
library(tidyverse)
starwars
blue <- starwars %>%
filter(eye_color=="blue")
brown <- starwars %>%
filter(eye_color=="brown")
df_set <- Filter(function(x) is.data.frame(get(x)), ls())
#This is what I want to do for one data frame
for (i in 1:nrow(blue)) {
if (is.na(blue$mass[i])) {
blue$mass[i] <- 10000
}
}
#How do I loop through all data frames as specified in vector df_set?
for (j in df_set) {
for (i in 1:nrow(j)) {
if (is.na(j$mass[i])) {
j$mass[i] <- 10000
}
}
}发布于 2020-10-14 21:28:39
我们可以使用map遍历数据集的list,并使用标准的tidyverse函数将NA替换为value
library(dplyr)
library(purrr)
library(tidyr)
df_set_new <- map(df_set, ~ .x %>%
mutate(mass = replace_na(mass, 10000)))数据
df_set <- list(blue, brown)发布于 2020-10-14 21:37:48
如果您想使用循环,请遵循@GregorThomas,的伟大建议,将您的数据帧存储在如下列表中:
library(tidyverse)
#Data
blue <- starwars %>%
filter(eye_color=="blue")
brown <- starwars %>%
filter(eye_color=="brown")
df_set <- Filter(function(x) is.data.frame(get(x)), ls())
#List
List <- list(blue,brown)
names(List) <- df_set
#Loop
for (i in df_set)
{
List[[i]]$mass <- ifelse(is.na(List[[i]]$mass),10000,List[[i]]$mass)
}一些检查:
在此之前,您需要:
sum(List$blue$mass)
[1] NA在循环之后,您将拥有:
sum(List$blue$mass)
[1] 71038.2如果您需要环境中的数据帧,您可以使用:
#Code
list2env(List,envir = .GlobalEnv)新的数据帧将具有您在循环中所做的更改。
https://stackoverflow.com/questions/64354332
复制相似问题