【问题标题】:Delete the last entry of groups in a data frame删除数据框中组的最后一个条目
【发布时间】:2016-10-07 01:15:32
【问题描述】:

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

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

  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。任何的想法?

【问题讨论】:

  • 您可以使用df %>% group_by(type) %>% slice(-n()),但如果您在组中有一行(如上面的C),它将被删除。如果您愿意,可以使用 ifelse 解决这个问题。

标签: r dataframe


【解决方案1】:

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

【讨论】:

  • 我的实际数据对于每种类型都有不同的长度,而不是只有两个,那么duplicated 将无法正常工作?
  • 我试过了,但似乎并没有摆脱每种类型的最后一个条目,而是只保留了每种类型的第一个条目..
  • 我想我会采用另一种方法,不过非常感谢您的耐心:)
【解决方案2】:

这是dplyr 的另一个选项。按“类型”分组后,我们检查行的顺序(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

【讨论】:

  • 我认为它有效!你能解释一下 `filter(row_number()!=n()|n()==1)` 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 1970-01-01
  • 2020-02-23
  • 2012-11-23
  • 1970-01-01
  • 1970-01-01
  • 2018-06-19
相关资源
最近更新 更多