删除/删除每个组中的最后一行/第一行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]
或dplyrslice(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))