[英]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.