【发布时间】:2020-12-16 17:49:28
【问题描述】:
我正在尝试使用两遍方法分别筛选数据集中的不同分组变量以查找不良记录和异常值。我想分别对每个变量进行筛选。我尝试运行一个 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"。除了我可以在我的环境窗口中看到“simplelist”!这里出了什么问题?
另外,如果有一种更优雅的方式来使用 tidyverse 表示法和 transmute_at 或其他东西(可能有)来实现我的总体目标,我会很高兴听到它,但我的问题是为什么 R 不能识别我初始化的列表。
【问题讨论】:
-
使用
simplelist[[i]] <-而不是simplelist[[i]] <<-。无论如何,使用<<-很少是合理的,更多的是表明不正确的功能架构和范围违规。在这种情况下,它既没有意义(for循环内的代码与for之外的代码在完全相同的范围内),而且正如您现在所看到的,会适得其反。
标签: r for-loop initialization tidyverse