获取新值开始的行索引

时间:2017-04-07 21:33:36

标签: r

我在下面创建了一个简单的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

3 个答案:

答案 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)

使用rlecumsum的其他选项。我们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)