每组删除第一行。

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

有没有简单的方法来做到这一点?
4个回答

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)

请注意,如果一个组只有1行,则slice(-1)将保留该行。 df [duplicated(df $ group),](由@a-webb)将删除这样的行。 - wxxyyyzz

8
< p >使用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
另一个基于 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

在这里,我删除了'group'中的第一个观察值 (df$group[-1]) 并将其与删除了最后一个观察值的向量进行比较 (df$group[-nrow(df)]))。由于比较的长度比数据集的nrow少一个,我们在顶部填充FALSE并使用它作为逻辑索引来对数据集进行子集化。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接