如何确定R中的值何时发生变化
下面是堆栈溢出的示例: 有两列:ind和value。当“值”增加100时,如何识别“ind” 例如,如何确定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=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]
。然而,这些都是相当具体的答案。。也许你在找更普通的东西。。?