过滤dplyr的摘要中

时间:2018-08-06 16:52:52

标签: r filter dplyr

我想在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

2 个答案:

答案 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