删除每组R中的最后一行/第一行

时间:2016-12-09 22:34:45

标签: r group-by

这是我的数据框:

categ <- c('a','a','a','b','b')
value <- c(1,2,5,4,5)
df <- data.frame(categ, value)

我想按categ列分组并删除每个组中的第一个/最后一个元素。理想情况下,我想创建一个列,其中包含每个组中第一个/最后一个元素的指示。这是我尝试过的,但它不起作用:

library('plyr')
ddply(df, .(categ), function(x) x[-nrow(x)])

P.S。这可能是重复的问题,但我是R的新手,R非常神秘,所以我不能立即移植解决方案。

5 个答案:

答案 0 :(得分:3)

使用{dplyr}删除每个组的第一行有一个更简单的解决方案:

library(dplyr)    
df %>% 
       group_by(categ) %>% 
       slice(2:n())

删除每组的最后一行:

df %>% 
    group_by(categ) %>% 
    slice(1:(n()-1))

答案 1 :(得分:2)

认为你只是错过了一个逗号来表示你想要行而不是默认的&#34; [&#34;这是列选择。删除最后一行:

ddply(df, .(categ), function(x) x[-nrow(x), ])

也可以使用head - 函数。要删除第一项,tail函数可以替换为head

> ddply(df, .(categ), function(x) head(x ,-1) )
  categ value
1     a     1
2     a     2
3     b     4

注意plyrdplyr不能很好地合作,我现在正在重启R.

答案 2 :(得分:1)

您可以改用dplyr软件包。以下代码删除了每个组的最后一个元素。

    library(dplyr)
    df %>% 
      dplyr::group_by(categ) %>% 
      dplyr::mutate(rank = 1:length(value)) %>% 
      dplyr::filter(rank < max(rank)) %>% 
      dplyr::mutate(rank = NULL)

答案 3 :(得分:1)

为了为每个组的第一个和最后一个元素创建一个指标列,您可以在基数R中执行此操作:

df$indicator <- FALSE

每组的最后一个元素:

df$indicator[cumsum(rle(as.numeric(df$categ))$lengths)] <- TRUE

#  categ value indicator
#1     a     1     FALSE
#2     a     2     FALSE
#3     a     5      TRUE
#4     b     4     FALSE
#5     b     5      TRUE

现在,如果您想删除每个组的最后一个元素,您可以执行以下操作:

df[!df$indicator,]

每组第一个元素:

df$indicator[which(diff(c(0,as.numeric(df$categ)))==1)] <- TRUE

#  categ value indicator
#1     a     1      TRUE
#2     a     2     FALSE
#3     a     5     FALSE
#4     b     4      TRUE
#5     b     5     FALSE

现在,如果您想删除每个组的第一个元素,您只需执行以下操作:

df[!df$indicator,]

答案 4 :(得分:1)

以下是使用base R

的选项
i1 <- with(df, duplicated(categ))
i1
#[1] FALSE  TRUE  TRUE FALSE  TRUE
i2 <- with(df, duplicated(categ, fromLast=TRUE))
i2
#[1]  TRUE  TRUE FALSE  TRUE FALSE
df[i1, ]
#  categ value
#2     a     2
#3     a     5
#5     b     5

df[i2, ]
#  categ value
#1     a     1
#2     a     2
#4     b     4