1

我有一个如下所示的数据集:

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 个数字(可以在样本中看到)

我想从这些数字中计算出来的东西称为“增量值”(dV)——它被计算为一个高值数字与相邻的 2 个低值数字的平均值之间的差异。例如,对于values1列 (1,3,2) 的前 3 个数字集,第一个 dV 将是 3-((2+1)/2)=1.5;然后取该组的最后一个数作为下一组的第一个数,做同样的计算,所以第二个dV是4-((2+2)/2)=2;等等。然后将该列的所有这些 dV 值记录values1在名为 的新列中dV1。对列执行相同的values2操作并将所有 dV 值记录在新dV2列中。请注意,在values2列,第一个数字高于第二个,因此忽略它并使用下一个 3 数字集 (2,4,1) 开始计算,并重复上述计算。

那么如何在 R 中执行这个计算呢?

先感谢您!

P/S:对不起,这是一个很长的问题,但我认为它包含了计算所需的所有信息。

4

1 回答 1

2

因为您想使用这些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
于 2017-04-07T15:15:16.283 回答