如何在 R 中进行此计算?
How to do this calculation in R?
我有一个如下所示的数据集:
groups <- c(1:20)
values1 <- c(1,3,2,4,2,5,1,6,2,7,3,5,2,6,3,5,1,5,3,4)
values2 <- c(3,2,4,1,5,2,4,1,3,2,6,1,4,2,5,3,7,1,4,2)
sample.data <- data.frame(groups,values1,values2)
head(sample.data)
groups values1 values2
1 1 1 3
2 2 3 2
3 3 2 4
4 4 4 1
5 5 2 5
6 6 5 2
描述:一个包含 20 个不同组的 20 组值(values1 和 values2)的数据框。这些数字遵循以下模式:
(1) 数字高低交替
(2) 如果values1
列中的数字大于其相邻的2个数字,则values2
列中的相应数字将小于其相邻的2个数字(如示例所示)
我想从这些数字中计算出的是 "delta value" (dV) - 它计算为高值数字与其相邻的 2 个低值数字的平均值之间的差异.例如,对于 values1
列 (1,3,2) 的前 3 个数字集,第一个 dV 将为 3-((2+1)/2)=1.5;然后把那一组的最后一个数作为下一组的第一个数,做同样的计算,所以第二个dV是4-((2+2)/2)=2;等等。然后在名为 dV1
的新列中记录 values1
列的所有这些 dV 值。对 values2
列执行相同的操作,并将所有 dV 值记录在新的 dV2
列中。注意在values2
列中,第一个数字比第二个数字大,所以忽略它并从下一个3数字集(2,4,1)开始计算并重复上面的计算。
那么我如何在 R 中执行这个计算呢?
提前致谢!
P/S:抱歉,这是一个很长的问题,但我认为它包含了计算所需的所有信息。
因为您想使用 dV
值进行绘图,所以最简单的方法是执行两次,每列一次
library(dplyr)
sample.data1 <- sample.data %>%
mutate(alt = row_number()%%2,
mean_adj_1 = (lag(values1) + lead(values1))/2,
dV1 = (values1 - mean_adj_1) * (1-alt)) %>%
filter(alt == 0 & !is.na(dV1)) %>%
select(-c(alt:mean_adj_1))
sample.data.2 <- sample.data %>%
mutate(alt = row_number()%%2,
mean_adj_2 = (lag(values2) + lead(values2))/2,
dV2 = (values2 - mean_adj_2) * alt) %>%
filter(alt == 1 & !is.na(dV2)) %>%
select(-c(alt:mean_adj_2))
说明:这可能可以通过更少的步骤完成,但这样您就可以看到发生了什么。 mean_adj
列为您提供前后行的平均值,而 alt
列允许您在不需要 dV
计算的行中放置零。 dV
列只是 value - mean_adj
。
结果:
> sample.data.1
groups values1 values2 dV1
1 2 3 2 1.5
2 4 4 1 2.0
3 6 5 2 3.5
4 8 6 1 4.5
5 10 7 2 4.5
6 12 5 1 2.5
7 14 6 2 3.5
8 16 5 3 3.0
9 18 5 1 3.0
> sample.data.2
groups values1 values2 dV2
1 3 2 4 2.5
2 5 2 5 3.5
3 7 1 4 2.5
4 9 2 3 1.5
5 11 3 6 4.5
6 13 2 4 2.5
7 15 3 5 2.5
8 17 1 7 5.0
9 19 3 4 2.5
我有一个如下所示的数据集:
groups <- c(1:20)
values1 <- c(1,3,2,4,2,5,1,6,2,7,3,5,2,6,3,5,1,5,3,4)
values2 <- c(3,2,4,1,5,2,4,1,3,2,6,1,4,2,5,3,7,1,4,2)
sample.data <- data.frame(groups,values1,values2)
head(sample.data)
groups values1 values2
1 1 1 3
2 2 3 2
3 3 2 4
4 4 4 1
5 5 2 5
6 6 5 2
描述:一个包含 20 个不同组的 20 组值(values1 和 values2)的数据框。这些数字遵循以下模式:
(1) 数字高低交替
(2) 如果values1
列中的数字大于其相邻的2个数字,则values2
列中的相应数字将小于其相邻的2个数字(如示例所示)
我想从这些数字中计算出的是 "delta value" (dV) - 它计算为高值数字与其相邻的 2 个低值数字的平均值之间的差异.例如,对于 values1
列 (1,3,2) 的前 3 个数字集,第一个 dV 将为 3-((2+1)/2)=1.5;然后把那一组的最后一个数作为下一组的第一个数,做同样的计算,所以第二个dV是4-((2+2)/2)=2;等等。然后在名为 dV1
的新列中记录 values1
列的所有这些 dV 值。对 values2
列执行相同的操作,并将所有 dV 值记录在新的 dV2
列中。注意在values2
列中,第一个数字比第二个数字大,所以忽略它并从下一个3数字集(2,4,1)开始计算并重复上面的计算。
那么我如何在 R 中执行这个计算呢?
提前致谢!
P/S:抱歉,这是一个很长的问题,但我认为它包含了计算所需的所有信息。
因为您想使用 dV
值进行绘图,所以最简单的方法是执行两次,每列一次
library(dplyr)
sample.data1 <- sample.data %>%
mutate(alt = row_number()%%2,
mean_adj_1 = (lag(values1) + lead(values1))/2,
dV1 = (values1 - mean_adj_1) * (1-alt)) %>%
filter(alt == 0 & !is.na(dV1)) %>%
select(-c(alt:mean_adj_1))
sample.data.2 <- sample.data %>%
mutate(alt = row_number()%%2,
mean_adj_2 = (lag(values2) + lead(values2))/2,
dV2 = (values2 - mean_adj_2) * alt) %>%
filter(alt == 1 & !is.na(dV2)) %>%
select(-c(alt:mean_adj_2))
说明:这可能可以通过更少的步骤完成,但这样您就可以看到发生了什么。 mean_adj
列为您提供前后行的平均值,而 alt
列允许您在不需要 dV
计算的行中放置零。 dV
列只是 value - mean_adj
。
结果:
> sample.data.1
groups values1 values2 dV1
1 2 3 2 1.5
2 4 4 1 2.0
3 6 5 2 3.5
4 8 6 1 4.5
5 10 7 2 4.5
6 12 5 1 2.5
7 14 6 2 3.5
8 16 5 3 3.0
9 18 5 1 3.0
> sample.data.2
groups values1 values2 dV2
1 3 2 4 2.5
2 5 2 5 3.5
3 7 1 4 2.5
4 9 2 3 1.5
5 11 3 6 4.5
6 13 2 4 2.5
7 15 3 5 2.5
8 17 1 7 5.0
9 19 3 4 2.5