如何确定R中的值何时发生变化

如何确定R中的值何时发生变化,r,R,下面是堆栈溢出的示例: 有两列:ind和value。当“值”增加100时,如何识别“ind” 例如, ind=4时,值增加100 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 10

下面是堆栈溢出的示例:

有两列:ind和value。当“值”增加100时,如何识别“ind”

例如,
ind=4时,值增加100

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

df您可以使用
diff
获取连续值之间的差值,并获取差值大于等于100的值的索引。将
+1
添加到索引中,因为
diff
返回长度比原始长度短1的向量

df$ind[which(diff(df$value) >= 100) + 1]
#[1] 4 7 9
dplyr
中,可以使用
lag
获取以前的值:

library(dplyr)
df %>% filter(value - lag(value) >= 100)

#  ind value
#1   4   200
#2   7   300
#3   9   400

您可以使用
diff
获取连续值之间的差值,并获取差值大于等于100的值的索引。将
+1
添加到索引中,因为
diff
返回长度比原始长度短1的向量

df$ind[which(diff(df$value) >= 100) + 1]
#[1] 4 7 9
dplyr
中,可以使用
lag
获取以前的值:

library(dplyr)
df %>% filter(value - lag(value) >= 100)

#  ind value
#1   4   200
#2   7   300
#3   9   400
像这样:

df$ind[c(FALSE, diff(as.numeric(df$value)) == 100)]
像这样:

df$ind[c(FALSE, diff(as.numeric(df$value)) == 100)]

为什么
value
上的
as.character
?我只是按照另一个堆栈溢出问题给出的示例。我猜它应该是.numeric?为什么
value
上的
as.character
?我只是在按照另一个堆栈溢出问题给出的示例。我猜它应该是.numeric?df$ind[哪个(diff(df$value)>=100)+1]当我只想看看它在哪里增加了100时,它就起作用了。当我将其更改为200时,得到的是整数(0),而不是“7”。这不能扩展到查看与第一个值(ind=1,value=100)相比的其他变化吗?@LR55如果需要与第一个值进行比较,请执行
df$ind[df$value-df$value[1]>=200]
df$ind[which(diff(df$value)>=100)+1]当我只想知道它增加了100的地方时,这就起作用了。当我将其更改为200时,得到的是整数(0),而不是“7”。这是否可以扩展为查看与第一个值(ind=1,value=100)相比的其他更改?@LR55如果需要与第一个值进行比较,请执行
df$ind[df$value-df$value[1]>=200]
当我尝试使用100时,它会起作用,但当我增加到200时(df$ind[c(FALSE,diff(as.numeric(df$value))==200)],我会得到整数(0)因为在两个连续的行之间,你没有一个值200的步长。你需要澄清你的问题…哦。。您如何将其与第一排进行比较?(即,与第一行“值”相比,“值”增加200的“ind”是什么?)给定
df,如果您只需要第一行:
df$ind[其中((df$value-df$value[1])==200)[1]
。然而,这些都是相当具体的答案。。也许你在寻找更通用的东西….?当我尝试100时,它是有效的,但当我增加到200(df$ind[c(FALSE,diff(as.numeric(df$value))==200)])时,我得到整数(0),因为在两个连续行之间,没有任何值为200的步长。你需要澄清你的问题…哦。。您如何将其与第一排进行比较?(即,与第一行“值”相比,“值”增加200的“ind”是什么?)给定
df,如果您只需要第一行:
df$ind[其中((df$value-df$value[1])==200)[1]
。然而,这些都是相当具体的答案。。也许你在找更普通的东西。。?