我在下面创建了一个简单的data.frame
。我想获得新origin
开始的所有行索引。在这种情况下,它将是1,5和8.有没有办法在没有循环的情况下执行此操作?
df <- data.frame(origin=c(rep('2016-01-01', 4), rep('2016-02-01',3), rep('2016-03-01',2)),
date=c('2016-01-01','2016-02-01','2016-03-01','2016-04-01','2016-02-01','2016-03-01','2016-04-01','2016-03-01','2016-04-01'),
val=rnorm(9))
df$date <- as.Date(df$date)
df$origin <- as.Date(df$origin)
df
origin date val
1 2016-01-01 2016-01-01 -2.0856573
2 2016-01-01 2016-02-01 -0.5930160
3 2016-01-01 2016-03-01 0.5370460
4 2016-01-01 2016-04-01 1.5539720
5 2016-02-01 2016-02-01 0.4866211
6 2016-02-01 2016-03-01 -0.1443780
7 2016-02-01 2016-04-01 -0.9286197
8 2016-03-01 2016-03-01 -0.6311255
9 2016-03-01 2016-04-01 1.1667005
答案 0 :(得分:3)
which(!duplicated(df$origin))
#[1] 1 5 8
如果值可以重复(或未排序),请使用以下命令查找一系列新值的开始位置。
which(c(TRUE, as.character(df$origin)[-NROW(df)] != as.character(df$origin)[-1]))
#[1] 1 5 8
答案 1 :(得分:1)
使用rle
和cumsum
的其他选项。我们c()
一个1
开头,因为它是开始,然后我们从运行中取出最后一个元素(因为之后没有新元素)。有点深奥,但是:
date_runs <- rle(as.character(df$origin))
cumsum(c(1,date_runs[[1]][-length(date_runs[[1]])]))
##[1] 1 5 8
答案 2 :(得分:0)
您可以使用dplyr
包中的函数:
library(dplyr)
df %>%
group_by(origin) %>%
slice(1)