簡體   English   中英

用於過濾和匯總數據幀的 R for 循環(使用 dyplr)?

[英]R for loop for filtering and summarizing dataframe (with 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_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

或者可以直接將輸出存儲在帶有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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM