假设我有一个这样的数据集
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
有没有简单的方法可以做到这一点?
带有
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)
非常简单
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
另一个
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
,并将其用作逻辑索引来对数据集进行子集化。
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
了解更多信息:
现在
dplyr
有slice_tail
并且支持by=
参数,你可以做
df %>% dplyr::slice_tail(n=-1, by=group)