我在R中有很多数据帧,如下所示:
A B
1 0
2 0
3 0
4 1
5 1
6 1
因此,在3到4之间,B会将值从0更改为1。返回R
的值的最A
方法是什么?B
会更改值?
数据B
仅更改一次值,并且A
被排序(从1到n)。
答案 0 :(得分:3)
这是一种可能的方法。使用diff
来获取b
列更改的值,但是要小心,b
的第一个值(根据change的定义)没有改变。 (问题是diff
返回的向量少一个。)
inx <- c(FALSE, diff(data$b) != 0)
data[inx, ]
# a b
#4 4 1
在看到OP对另一篇文章的评论之后,以下代码显示,当b
以任何值(不仅是零)开头时,该方法也可以解决问题。
data2 <- data.frame(a=c(1,2,3,4,5,6),b=c(1,1,1,0,0,0))
inx <- c(FALSE, diff(data2$b) != 0)
data2[inx, ]
# a b
#4 4 0
答案 1 :(得分:2)
如OP所述,
数据B中的值仅更改一次
我们可以将cumsum
与duplicated
和which.max
一起使用
which.max(cumsum(!duplicated(df$B)))
#[1] 4
如果该值多次更改,则将为最后一次更改提供索引。
如果我们需要对行进行子集化,那么我们可以做
df[which.max(cumsum(!duplicated(df$B))), ]
# A B
#4 4 1
进一步分解以便更好地理解
!duplicated(df$B)
#[1] TRUE FALSE FALSE TRUE FALSE FALSE
cumsum(!duplicated(df$B))
#[1] 1 1 1 2 2 2
which.max(cumsum(!duplicated(df$B)))
#[1] 4
答案 2 :(得分:1)
为了识别序列中的更改,可以使用diff
,如以下代码所示:
my_df <- data.frame(A = 1:6, B = c(0,0,0,1,1,1))
which(diff(my_df$B)==1)+1
[1] 4