这是我的数据框:
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非常神秘,所以我不能立即移植解决方案。
答案 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
注意plyr
和dplyr
不能很好地合作,我现在正在重启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