删除数据框中组的最后一个条目

时间:2016-10-07 01:15:33

标签: r dataframe

我希望通过删除具有相同元素的所有组的最后一个条目来清理我的数据。

我的数据看起来有点像这样:

  type  2   3  
 1 A    2.3 4  
 2 A    3.4 5  
 3 B    5.5 6  
 4 B    6   7 
 5 B    3   7 
 6 C    5   6  
 ....

即。我试图摆脱每个具有相同类型的组的最后一个条目,所以它看起来像这样。

  type  2   3  
 1 A    2.3 4  
 2 B    5.5 6 
 3 B    6   7 
 4 C    5   6

我的实际数据对于每种类型都有不同的长度,通常超过几百。我想到了group_by然后last(),但它似乎只适用于summarize。任何的想法?

2 个答案:

答案 0 :(得分:3)

dat成为您的数据框,您可以使用

dat[duplicated(dat$type, fromLast = TRUE), ]

其中duplicated(, fromLast = TRUE)会向后找到重复项。

示例

set.seed(0)
dat <- data.frame(type = sort(sample(LETTERS[1:4], 12, TRUE)), x = 1:12)

#   type  x
#1     A  1
#2     A  2
#3     A  3
#4     B  4
#5     B  5
#6     C  6
#7     C  7
#8     C  8
#9     D  9
#10    D 10
#11    D 11
#12    D 12

dat[duplicated(dat$type, fromLast = TRUE), ]

#   type  x
#1     A  1
#2     A  2
#4     B  4
#6     C  6
#7     C  7
#9     D  9
#10    D 10
#11    D 11

答案 1 :(得分:2)

以下是dplyr的另一个选项。按'type'分组后,我们检查行的顺序(row_number())是否不等于行数(n() - 对应于最后一行编号)或| )如果行数等于1(n()==1)。所以,基本上,我们通过创建逻辑索引(row_number() !=n())以及异常来删除最后一行,以处理只有一行(n()==1)的情况。

library(dplyr)
df1 %>% 
    group_by(type) %>%
    filter(row_number()!=n()|n()==1)
#  type   `2`   `3`
#  <chr> <dbl> <int>
#1     A   2.3     4
#2     B   5.5     6
#3     B   6.0     7
#4     C   5.0     6