我想在filter
包的summarise
内使用dplyr
或类似功能。因此,我有一个数据框(例如mtcars
),在这里我需要按因子分组(例如cyl
),然后针对每个{{1 }}输入-> wt
。
问题是如何在cyl
函数内对wt.pc
列进行子集/过滤以获得百分比,但没有最后wt
行?
我已经尝试过此代码,但是它返回summarise
:(
10
wt.pc.short —每个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
答案 0 :(得分:2)
像这样吗?
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
答案 1 :(得分:1)
我认为您可以这样做。首先,我们计算组中的行号,如果max(row_number) > 10
,则我们有足够的观察力来删除最后10行,在这种情况下,我们将过滤到max(ID)-9
(即删除最后10行),否则{ {1}}返回true,并且不删除任何内容。
ID==ID