R for循环过滤和汇总数据帧(与dyplr)?



我使用一个简单的命令与dyplr首先通过两列过滤数据帧,然后报告另一列的总和。但是,我想创建一个循环,以便过滤标准可以通过值列表自动执行。例如,单个实例的代码:

library(dplyr)
df = data.frame(Category1 = sample(c("FilterMe","DoNotFilterMe"), 15, replace=TRUE), 
Category2 = sample(c("1","3","5","10"),15, replace=TRUE),
Value = 1:15)
df %>%
filter(Category1=="FilterMe" & Category2="1") %>%
summarize(result=sum(Value))

这很好地工作,我得到一个单独的值15。然而,我想循环这个命令,这样我就可以为一个整数列表(不是顺序的)定义的Category2执行多个值。我希望它对I的每个值进行循环,并每次提供不同的输出值。我尝试了下面的代码,但留下了一个空值。

library(dplyr)
for (i in c(1,3,5,10){
df %>%
filter(Category1=="FilterMe" & Category2="i") %>%
summarize(result=sum(Value))}

如果除了循环之外还有其他方法可以实现相同的目标,我觉得也可以。

如果我明白你想做什么,你正在寻找group_by。

library(dplyr)
df %>%
filter(Category1 =="FilterMe") %>%
group_by(Category2) %>%
summarize(result=sum(Value))

我们不需要循环。可以用%in%代替==简化,再用group_bysum逼近

library(dplyr)
df %>%
filter(Category1=="FilterMe" & Category2 %in% c(1, 3, 5, 10)) %>%
group_by(Category2) %>%
summarize(result=sum(Value))

与产出

# A tibble: 4 × 2
Category2 result
<chr>      <int>
1 1              4
2 10            15
3 3             17
4 5             19

对于for循环,我们需要在每次迭代中存储输出,即list

v1  <- c(1, 3, 5, 10)
lst1 <- vector('list', length(v1))
for (i in seq_along(v1)){
lst1[[i]] <- df %>%
filter(Category1=="FilterMe" & Category2 ==v1[i]) %>%
summarize(result=sum(Value))
}

与产出

> lst1
[[1]]
result
1      4
[[2]]
result
1     17
[[3]]
result
1     19
[[4]]
result
1     15

或者可以直接将输出存储在map/lapplylist

library(purrr)
map(c(1, 3, 5, 10), ~ 
df %>%
filter(Category1 == "FilterMe", Category2 == .x) %>%
summarise(result = sum(Value)))

与产出

[[1]]
result
1      4
[[2]]
result
1     17
[[3]]
result
1     19
[[4]]
result
1     15

最新更新