假设我有一个像这样的数据集
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
有一种简单的方法吗?
答案 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
: