查找数据框中变量更改其值的位置

时间:2018-08-28 07:46:10

标签: r

我在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)。

3 个答案:

答案 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中的值仅更改一次

我们可以将cumsumduplicatedwhich.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