方法在R中查找具有不同行间距的行之间的差异



我想在数据帧中添加一个额外的列,该列显示某些行之间的差异,其中行之间的距离也取决于表中的值。

我发现:

mutate(Col_new = Col_1 - lead(Col_1, n = x))

可以找到固定n的差值,但只能使用整数作为输入。如果行之间的距离不同,您将如何找到行之间的差异?

我正在尝试获得Col_new中的输出,这是I和I+n行之间的差,其中n应取列Count中的值。(数据四舍五入,因此Col_new中可能存在0.01的差异(。

col_1 count Col_new
1   0.90     1   -0.68
2   1.58     1   -0.31
3   1.89     1    0.05
4   1.84     1    0.27
5   1.57     1    0.27
6   1.30     2   -0.26
7   1.25     2   -0.99
8   1.56     2   -1.58
9   2.24     2   -1.80
10  3.14     2   -1.58
11  4.04     3   -0.95
12  4.72     3    0.01
13  5.04     3    0.60
14  4.99     3    0.60
15  4.71     3    0.01
16  4.44     4   -1.84
17  4.39     4      NA
18  4.70     4      NA
19  5.38     4      NA
20  6.28     4      NA

数据:

df <- data.frame(Col_1 = c(0.90, 1.58, 1.89, 1.84, 1.57, 1.30, 1.35, 
1.56, 2.24, 3.14, 4.04, 4.72, 5.04, 4.99, 
4.71, 4.44, 4.39, 4.70, 5.38, 6.28),
Count = sort(rep(1:4, 5)))

一些生成预期输出的代码,但无疑可以提高效率。

library(dplyr)
df %>% 
mutate(col_2 = sapply(1:4, function(s){lead(Col_1, n = s)})) %>%
rowwise() %>%
mutate(Col_new = Col_1 - col_2[Count]) %>%
select(-col_2)

输出:

# A tibble: 20 × 3
# Rowwise: 
Col_1 Count Col_new
<dbl> <int>   <dbl>
1  0.9      1 -0.68  
2  1.58     1 -0.310 
3  1.89     1  0.0500
4  1.84     1  0.27  
5  1.57     1  0.27  
6  1.3      2 -0.26  
7  1.35     2 -0.89  
8  1.56     2 -1.58  
9  2.24     2 -1.8   
10  3.14     2 -1.58  
11  4.04     3 -0.95  
12  4.72     3  0.0100
13  5.04     3  0.600 
14  4.99     3  0.600 
15  4.71     3  0.0100
16  4.44     4 -1.84  
17  4.39     4 NA     
18  4.7      4 NA     
19  5.38     4 NA     
20  6.28     4 NA     
df %>% mutate(Col_new = case_when(
df$count == 1 ~ df$col_1 - lead(df$col_1 , n = 1),
df$count == 2 ~ df$col_1  - lead(df$col_1 , n = 2),
df$count == 3 ~ df$col_1  - lead(df$col_1 , n = 3),
df$count == 4 ~ df$col_1  - lead(df$col_1 , n = 4),
df$count == 5 ~ df$col_1  - lead(df$col_1 , n = 5)
))
col_1 count Col_new
1   0.90     1   -0.68
2   1.58     1   -0.31
3   1.89     1    0.05
4   1.84     1    0.27
5   1.57     1    0.27
6   1.30     2   -0.26
7   1.25     2   -0.99
8   1.56     2   -1.58
9   2.24     2   -1.80
10  3.14     2   -1.58
11  4.04     3   -0.95
12  4.72     3    0.01
13  5.04     3    0.60
14  4.99     3    0.60
15  4.71     3    0.01
16  4.44     4   -1.84
17  4.39     4      NA
18  4.70     4      NA
19  5.38     4      NA
20  6.28     4      NA

这会给你带来你想要的结果,但对于更多的情况来说,这不是一个很好的解决方案。想象一下,你的任务有10个或更多不同的计数,需要另一个解决方案。

相关内容

  • 没有找到相关文章

最新更新