如何在R中按组省略两个最高值和最低值的行

时间:2015-12-18 00:31:35

标签: r max conditional

这似乎是一个非常基本的问题,但我似乎无法找到解决方案。

如何删除R中几个因子的variable的两个最高值和 最低值的(三)行?我稍微修改了airquality以得到一个例子(抱歉,我还是初学者):

set.seed(1)
airquality$var1 <- c(sample(1:3, 153, replace=T))
airquality$var2 <- c(sample(1:2, 153, replace=T))
airquality2 <- airquality
airquality2$Solar.R <- as.numeric(airquality2$Solar.R)
airquality2$Solar.R <- airquality2$Solar.R*2
airquality3 <- airquality
airquality3$Solar.R <- as.numeric(airquality3$Solar.R)
airquality3$Solar.R <- airquality3$Solar.R*2.5
test <- round(na.omit(rbind(airquality, airquality2, airquality3)))
test$var1 <- factor(test$var1)
test$var2 <- factor(test$var2)
head(test)

来到:

head(test)

#   Ozone Solar.R Wind Temp Month Day var1 var2
# 1    41     190    7   67     5   1    1    1
# 2    36     118    8   72     5   2    2    2
# 3    12     149   13   74     5   3    2    1
# 4    18     313   12   62     5   4    3    2
# 7    23     299    9   65     5   7    3    1
# 8    19      99   14   59     5   8    2    1

现在,我想删除Solar.R的两个最高和最低值的行,类似group_by(Month, var1, var2)。由于有30个因子组合(5 * 3 * 2),因此应省略90行。其余数据应该保持不变。我看了Min&amp; Max,但无法让它发挥作用。任何帮助都将很高兴。

3 个答案:

答案 0 :(得分:5)

我认为您正在寻找slice

library("dplyr")

sliced = 
    test %>%
    group_by(Month, var1, var2) %>% # group
    arrange(Solar.R) %>%            # within-group, order by Solar.R
    slice(3:(n() - 2))              # keep the 3rd through the 3rd-to-last row

nrow(sliced)
# [1] 233

修改:我最初有3:(n() - 3),已更正为3:(n() - 2)。一个很好的理智检查是考虑(1:10)[3:(10 - 3)] vs (1:10)[3:(10 - 2)]。我没有费心去阅读您的模拟代码,但是当我使用n_group()检查了一些内容时,我看到了27个群组,而不是您提出的30个群组。 (也许是一个种子问题,与rawr&#39; set.seed(1)有28个小组。)

更多修改:根据您的编辑,您可能希望省略最低值和两个最高值,而不是两个最低值和两个最高值。只需将3:(n() - 2))更改为2:(n() - 2)即可进行调整。

答案 1 :(得分:1)

这是一种data.table方式,但我猜dplyr会更冗长。

insertString(...)

答案 2 :(得分:0)

我们还可以使用.I获取data.table中的行索引,然后根据该值对其进行子集化。

library(data.table)
i1 <- setDT(test)[order(Solar.R), .I[3:(.N-1)],.(Month, var1, var2)]$V1
test[i1]