确定R data.frame列中值的更改位置

Gau*_*sal 5 r dataframe

我有一个data.frame在R中的value列包含该类的数据character.我想确定value更改的行号.在下面的示例中,我想要退出4,7和9.有没有办法在没有循环的情况下执行此操作?

df <- data.frame(ind=1:10,
 value=as.character(c(100,100,100,200,200,200,300,300,400,400)), 
 stringsAsFactors=F)
df
   ind value
1    1   100
2    2   100
3    3   100
4    4   200
5    5   200
6    6   200
7    7   300
8    8   300
9    9   400
10  10   400
Run Code Online (Sandbox Code Playgroud)

the*_*ail 7

类似于@ thc的答案,但没有依赖:

which(c(FALSE, tail(df$value,-1) != head(df$value,-1)))
#[1] 4 7 9
Run Code Online (Sandbox Code Playgroud)


thc*_*thc 6

一个简单的解决方案是在dplyr中使用lag函数:

which(df$value != dplyr::lag(df$value))
Run Code Online (Sandbox Code Playgroud)


Hub*_*rtL 5

您可以使用rle(运行长度编码):

cumsum(rle(df$value)$lengths)+1
[1]  4  7  9 11
Run Code Online (Sandbox Code Playgroud)

您可以使用head删除最后一个值:

head(cumsum(rle(df$value)$lengths)+1, -1)
Run Code Online (Sandbox Code Playgroud)