簡體   English   中英

過濾內部dplyr的總結

[英]filter inside dplyr's summarise

我想在dplyr包中summarise使用filter或類似功能。 所以我有一個數據幀(例如mtcars ),我需要按因子分組(例如cyl ),然后計算一些統計數據和每個cyl類型的總wt的百分比 - > wt.pc

問題是如何在summarise函數中對wt列進行子集/過濾以獲得百分比但不包含最后10行?

我試過這段代碼,但它返回NA :(

mtcars %>%
  group_by(cyl) %>%
  summarise(wt = round(sum(wt)),
            wt.pc = sum(wt) * 100 / sum(mtcars[, 6]),
            wt.pc.short = sum(wt[1:22]) * 100 / sum(mtcars[1:22, 6]),
            drat.max = round(max(drat)))

# A tibble: 3 x 5
    cyl    wt wt.pc wt.pc.short drat.max
  <dbl> <dbl> <dbl>       <dbl>    <dbl>
1     4    25  24.3          NA        5
2     6    22  21.4          NA        4
3     8    56  54.4          NA        4

wt.pc.short - 較短數據幀mtcars[1:22,]每個cyl的總和( wt )的mtcars[1:22,]

像這樣的東西?

mtcars %>%
  mutate(id = row_number()) %>% 
  group_by(cyl) %>%
  summarise(wt_new = round(sum(wt)), # note the change in name here!
            wt.pc = sum(wt) * 100 / sum(mtcars[, 6]),
            wt.pc.short = sum(wt[id<23]) * 100 / sum(mtcars[1:22, 6]),
            drat.max = round(max(drat)))

# A tibble: 3 x 5
    cyl wt_new wt.pc wt.pc.short drat.max
  <dbl>  <dbl> <dbl>       <dbl>    <dbl>
1     4     25  24.3        22.7        5
2     6     22  21.4        25.8        4
3     8     56  54.4        51.6        4

這里的重要部分是,當您在調用中指定wt進行summarize ,對wt所有后續引用將采用先前分配的wt ,而不是原始wt 因此,諸如wt[1:22]類的陳述有些問題。 你可以在這里看到:

mean(mtcars[,"mpg"])
# [1] 20.09062
var(mtcars[,"mpg"])
# [1] 36.3241
mtcars %>% summarise(var_before = var(mpg),  
                     mpg = mean(mpg), 
                     var_after = var(mpg))

#  var_before      mpg var_after
# 1    36.3241 20.09062        NA

我想你可以這樣做。 首先我們計算組內的行號,如果max(row_number) > 10那么我們有足夠的觀察值來刪除最后10行,在這種情況下我們過濾到max(ID)-9 (即刪除最后10行),否則ID==ID返回true並且不刪除任何內容。

mtcars %>% group_by(cyl) %>% 
  mutate(ID = row_number()) %>% 
  filter(if (max(ID) > 10) ID < (max(ID) - 9) else ID == ID)

暫無
暫無

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

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