在R数据帧中按对角线相减?
这是我的数据框:在R数据帧中按对角线相减?,r,dataframe,dplyr,tidyverse,R,Dataframe,Dplyr,Tidyverse,这是我的数据框: ID max_t min_t diff 1.9 84904814 84904755 NA 1.4 84905065 84905014 -310 1.6 84905290 84905248 -276 1.0 84906383 84906316 -1135 2.9 82023344 82023251 2882972 2.4 82023527 82023419
ID max_t min_t diff
1.9 84904814 84904755 NA
1.4 84905065 84905014 -310
1.6 84905290 84905248 -276
1.0 84906383 84906316 -1135
2.9 82023344 82023251 2882972
2.4 82023527 82023419 -276
2.6 82023669 82023561 -250
2.0 82023811 82023728 -250
我的问题是diff列
我希望它检查的范围/时间差如下:
1.4 min_t - 1.9 max_t (84905014-84904814)
1.6 min_t - 1.4 max_t (84905248-84905065)
预期产出:
ID max_t min_t diff
1 1.9 84904814 84904755 200
2 1.4 84905065 84905014 183
3 1.6 84905290 84905248 1026
4 1.0 84906383 84906316 -2883132
5 2.9 82023344 82023251 75
6 2.4 82023527 82023419 34
7 2.6 82023669 82023561 59
8 2.0 82023811 82023728 NA
这是我所做的,但它没有提供我想要的。
请告诉我这里错过了什么
test$diff <- lag(test$min_t, 1) - test$max_t
test$diff您应该使用lead
而不是lag
:
library(dplyr)
test %>%
mutate(lag_min_t = lag(min_t), # For demo
lead_min_t = lead(min_t), # For demo
diff = lead(min_t) - max_t)
结果:
ID max_t min_t diff lag_min_t lead_min_t
1 1.9 84904814 84904755 200 NA 84905014
2 1.4 84905065 84905014 183 84904755 84905248
3 1.6 84905290 84905248 1026 84905014 84906316
4 1.0 84906383 84906316 -2883132 84905248 82023251
5 2.9 82023344 82023251 75 84906316 82023419
6 2.4 82023527 82023419 34 82023251 82023561
7 2.6 82023669 82023561 59 82023419 82023728
8 2.0 82023811 82023728 NA 82023561 NA
您应该使用lead
而不是lag
:
library(dplyr)
test %>%
mutate(lag_min_t = lag(min_t), # For demo
lead_min_t = lead(min_t), # For demo
diff = lead(min_t) - max_t)
结果:
ID max_t min_t diff lag_min_t lead_min_t
1 1.9 84904814 84904755 200 NA 84905014
2 1.4 84905065 84905014 183 84904755 84905248
3 1.6 84905290 84905248 1026 84905014 84906316
4 1.0 84906383 84906316 -2883132 84905248 82023251
5 2.9 82023344 82023251 75 84906316 82023419
6 2.4 82023527 82023419 34 82023251 82023561
7 2.6 82023669 82023561 59 82023419 82023728
8 2.0 82023811 82023728 NA 82023561 NA
好的。我看到了。我认为你的问题在于,滞后不是在时间上向前移动,而是在时间上向后移动。在您的例子中,滞后(test$min\u t,1)不是从1.9min\t开始,而是在1.9min\u t之前开始,这是不存在的。这也会导致您的操作向后(diff实际上是1.4max\u t-1.9min\u t),这与您想要的相反
不使用滞后,只需减去不同位置的向量,并在向量的开头添加NA:
test$diff <- c(NA,min_t[-1] - max_t[-length(max_t)])
测试$diff正常。我看到了。我认为你的问题在于,滞后不是在时间上向前移动,而是在时间上向后移动。在您的例子中,滞后(test$min\u t,1)不是从1.9min\t开始,而是在1.9min\u t之前开始,这是不存在的。这也会导致您的操作向后(diff实际上是1.4max\u t-1.9min\u t),这与您想要的相反
不使用滞后,只需减去不同位置的向量,并在向量的开头添加NA:
test$diff <- c(NA,min_t[-1] - max_t[-length(max_t)])
test$diff-Sure@useR我做了,你能解释一下“它没有提供我想要的东西”是什么意思吗?你从代码中得到了什么?@useR你可以在我的问题中看到它不应该是-310,应该是200。等等我想也许融化会有帮助。我误解了你的问题。下次,最好提供您的预期输出,以便其他人可以将他们的答案与您的输出进行比较。当然@useR I did it。您能解释一下“它没有提供我想要的东西”的意思吗?你从代码中得到了什么?@useR你可以在我的问题中看到它不应该是-310,应该是200。等等我想也许融化会有帮助。我误解了你的问题。下次,最好提供您的预期输出,以便其他人可以将他们的答案与您的输出进行比较。好极了!谢谢解决了我的问题!好极了!谢谢解决了我的问题!