删除每组的第一行

问题描述 投票:0回答:5

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

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

有没有简单的方法可以做到这一点?

r
5个回答
16
投票

带有

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)

9
投票

非常简单

duplicated

df[duplicated(df$group),]
 团体成绩
2 1 10
3 1 22
5 2 6
7 3 20
9 4 2
10 4 60
12 5 5

2
投票

另一个

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

在这里,我删除了“组”中的第一个观察值 (

df$group[-1]
),并将 (
==
) 与删除了最后一个观察值的向量 (
df$group[-nrow(df)])
) 进行了比较。 由于比较的
length
比数据集的
nrow
少 1,因此我们在顶部添加
FALSE
,并将其用作逻辑索引来对数据集进行子集化。


1
投票
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
lag
dplyr
了解更多信息:

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


0
投票

现在

dplyr
slice_tail
并且支持
by=
参数,你可以做

df %>% dplyr::slice_tail(n=-1, by=group)
© www.soinside.com 2019 - 2024. All rights reserved.