我使用帶有 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))}
如果除了回圈之外還有另一種方式可以實作對我來說很好的相同目標。
uj5u.com熱心網友回復:
如果我明白你想做什么,你正在尋找 group_by。
library(dplyr)
df %>%
filter(Category1 =="FilterMe") %>%
group_by(Category2) %>%
summarize(result=sum(Value))
uj5u.com熱心網友回復:
我們不需要回圈。它可以簡化為%in%而不是==然后做group_by sum方法
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
或者可以直接將輸出存盤在list帶有map/lapply
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/338775.html
上一篇:從函式回傳基本圖和ggplot
