删除每个组的第一行

时间:2015-08-19 00:24:32

标签: r

假设我有一个像这样的数据集

df <- data.frame(group = c(rep(1,3),rep(2,2), rep(3,2),rep(4,3),rep(5, 2)), score = c(30, 10, 22, 44, 6, 5, 20, 35, 2, 60, 14,5)) 

   group score
1      1    30
2      1    10
3      1    22
4      2    44
5      2     6
6      3     5
7      3    20
8      4    35
9      4     2
10     4    60
11     5    14
12     5     5

我想删除每个组的第一行,预期的输出应该如下所示:

   group score
1      1    10
2      1    22
3      2     6
4      3    20
5      4     2
6      4    60
7      5     5

有一种简单的方法吗?

4 个答案:

答案 0 :(得分:6)

duplicated

非常简单
df[duplicated(df$group),]
   group score
2      1    10
3      1    22
5      2     6
7      3    20
9      4     2
10     4    60
12     5     5

答案 1 :(得分:2)

dplyr选项是选择忽略第一行的行

library(dplyr)
df %>%
  group_by(group) %>%
  slice(2:n())

#  group score
#  <dbl> <dbl>
#1  1.00 10.0 
#2  1.00 22.0 
#3  2.00  6.00
#4  3.00 20.0 
#5  4.00  2.00
#6  4.00 60.0 
#7  5.00  5.00

@Rich Scriven在现在删除的答案中显示了另一种方式

df %>%
  group_by(group) %>%
  slice(-1)

答案 2 :(得分:1)

另一个base R选项是检查相邻的元素

df[c(FALSE,df$group[-1]==df$group[-nrow(df)]),]
#   group score
#2      1    10
#3      1    22
#5      2     6
#7      3    20
#9      4     2
#10     4    60
#12     5     5

在这里,我删除了&#39;组中的第一个观察结果。 (df$group[-1])并将(==)与去除最后一次观察的向量进行比较(df$group[-nrow(df)]))。由于比较的length比数据集的nrow小1,我们在顶部填充FALSE并将其用作逻辑索引以对数据集进行子集化。

答案 3 :(得分:0)

dplyr::filter(df, group == lag(group))
   group score
1     1    10
2     1    22
3     2     6
4     3    20
5     4     2
6     4    60
7     5     5

有关详细信息,请参阅包lead的{​​{1}}和lag

https://dplyr.tidyverse.org/reference/lead-lag.html