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

删除/删除每个组中的最后一行/第一行R,r,group-by,R,Group By,这是我的数据框: categ <- c('a','a','a','b','b') value <- c(1,2,5,4,5) df <- data.frame(categ, value) 另外,这可能是一个重复的问题,但我不熟悉R,R非常神秘,因此我无法立即移植解决方案。您可以使用dplyr包。下面的代码删除每个组的最后一个元素 library(dplyr) df %>% dplyr::group_by(categ) %>% dplyr::

这是我的数据框:

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

另外,这可能是一个重复的问题,但我不熟悉R,R非常神秘,因此我无法立即移植解决方案。

您可以使用dplyr包。下面的代码删除每个组的最后一个元素

library(dplyr) df %>% dplyr::group_by(categ) %>% dplyr::mutate(rank = 1:length(value)) %>% dplyr::filter(rank < max(rank)) %>% dplyr::mutate(rank = NULL) 图书馆(dplyr) df%>% dplyr::分组依据(类别)%>% dplyr::mutate(秩=1:长度(值))%>% dplyr::筛选器(秩<最大值(秩))%>% dplyr::mutate(秩=NULL)
假设您只是缺少一个逗号,表示您需要行,而不是“[”的默认值,这是列选择。要删除最后一行:

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

注意到
plyr
dplyr
不能很好地配合,我现在重新启动R。

为了为每组的第一个和最后一个元素创建一个指示符列,您可以在基本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$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

这里有一个使用
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

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

library(dplyr)    
df %>% 
       group_by(categ) %>% 
       slice(2:n())
df %>% 
    group_by(categ) %>% 
    slice(1:(n()-1))
要删除每组的最后一行,请执行以下操作:

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

使用数据非常简单。表
setDT(df)[,值[-c(1L,.N)],by=categ]
或dplyr
slice(groupby(df,categ),-c(1,N())
使用
dplyr
,您可以
df%>%groupby(categ)%%过滤器(row_number()!=1和row_number()!=N())
删除每个组中的第一行和最后一行或
df%>%groupby(categ)%%>%变异(ind=ifelse(行号()==1;行号()==n(),1,0)
创建指示列。您的问题是否已解决,如果已解决,请将其标记为已解决。@我刚刚解决了,很抱歉耽搁了。阅读所有解决方案并理解它们需要时间。没问题,只是我在搜索我可以帮助的问题。当问题已经解决时,它很好:)所有的答案都很好,但我猜
dplyr
在可读性方面获胜。
df %>% 
    group_by(categ) %>% 
    slice(1:(n()-1))