为什么 R 在 for 循环中无法识别我的对象?

Why is R not recognizing my object in for loop?

我正在尝试使用两次通过方法分别筛选数据集中不同的分组变量以查找不良记录和异常值。我想分别对每个变量进行筛选。我尝试 运行 一个 for 循环并使用 tidyverse 语言,预期数据帧列表,但收到一条错误消息。这是一个例子:

require(tidyverse)

# make the example dataframe
factor1 <- c("yes", "no","yes","no","no", "yes")
factor2 <- c("Female","Female","Male","Male", "Male", "Female")
a <- sample(1:100, 6, replace=TRUE)
b <- sample(1:100, 6, replace=TRUE)
c <- sample(1:100, 6, replace=TRUE)
d <- sample(1:100, 6, replace=TRUE)
e <- sample(1:100, 6, replace=TRUE)
simpledata <- data.frame(factor1, factor2, a, b, c, d, e)

#list of variable names to loop over
simple_vars = c("a","b","c","d","e")
   
#initialize list to store results in     
simplelist <- vector(mode="list", length=length(simple_vars))

for(i in simple_vars){
    simplelist[[i]] <<- simpledata %>%
    group_by(factor1, factor2) %>%
    filter(.data[[i]] < 5*median(.data[[i]])) %>%
    filter(between(.data[[i]], mean(.data[[i]])-3*sd(.data[[i]]),
                mean(.data[[i]])+3*sd(.data[[i]])))
}

我收到以下错误:"Error in simplelist[[i]] <<- simpledata %>% group_by(factor1, factor2) %>% : object 'simplelist' not found"。除了我可以在我的环境 window 中看到 'simplelist'!这里出了什么问题?

此外,如果有更优雅的方法来使用 tidyverse 符号和 transmute_at 或其他东西(可能有)来实现我的总体目标,我会很高兴听到它,但我的问题是为什么R 无法识别我初始化的列表。

首先,您忘记以 simple_vars 中出现的相同方式命名 simplelist 的元素。因此,当 for() 将值“a”传递给 simplelist[["a"]] 时,可能会出现错误,因为 simplelist 中没有具有此名称的元素。错误的另一个来源是赋值符号,您在错误的位置使用了特殊情况 (<<-)。

factor1 <- c("yes", "no","yes","no","no", "yes")
factor2 <- c("Female","Female","Male","Male", "Male", "Female")
a <- sample(1:100, 6, replace=TRUE)
b <- sample(1:100, 6, replace=TRUE)
c <- sample(1:100, 6, replace=TRUE)
d <- sample(1:100, 6, replace=TRUE)
e <- sample(1:100, 6, replace=TRUE)
simpledata <- data.frame(factor1, factor2, a, b, c, d, e)

#list of variable names to loop over
simple_vars = c("a","b","c","d","e")

#initialize list to store results in     
simplelist <- list("a" = "", "b" = "", "c" = "", "d" = "", "e" = "")

for(i in simple_vars){
  simplelist[[i]] <- simpledata %>%
    group_by(factor1, factor2) %>%
    filter(.data[[i]] < 5*median(.data[[i]])) %>%
    filter(between(.data[[i]], mean(.data[[i]])-3*sd(.data[[i]]),
                   mean(.data[[i]])+3*sd(.data[[i]])))
}

<<- 运算符正在设置一个全局变量,但您不需要这样做。此外,您可以创建零大小的初始列表并在 for 循环中添加条目。

require(tidyverse)

# make the example dataframe
factor1 <- c("yes", "no","yes","no","no", "yes")
factor2 <- c("Female","Female","Male","Male", "Male", "Female")
a <- sample(1:100, 6, replace=TRUE)
b <- sample(1:100, 6, replace=TRUE)
c <- sample(1:100, 6, replace=TRUE)
d <- sample(1:100, 6, replace=TRUE)
e <- sample(1:100, 6, replace=TRUE)
simpledata <- data.frame(factor1, factor2, a, b, c, d, e)

#list of variable names to loop over
simple_vars = c("a","b","c","d","e")

#initialize list to store results in     
simplelist <- vector(mode="list")

for(i in simple_vars){
    simplelist[[i]] <- simpledata %>%
    group_by(factor1, factor2) %>%
    filter(.data[[i]] < 5*median(.data[[i]])) %>%
    filter(between(.data[[i]], mean(.data[[i]])-3*sd(.data[[i]]),
            mean(.data[[i]])+3*sd(.data[[i]])))
}