如何获得R数据帧中的差异之和

How to get the sum of differences in R dataframe

我想知道是否有人知道任何 functions/tactics 来计算我遇到的这个问题:

所以如果我有变量 x

x <- c(1,2,3,4,5,6,7,8,9) 
dataframe <- data.frame(x)
dataframe$y <- 0

并且我想计算每个值与其余值之间的差值之和。然后这个变量中的每个值都会有一个差异分数。类似的东西: y[1]<-sum((x[1]-2) + (x[1]-3) + (x[1]-4)....(x[1]-9))

类似的东西(因为实际上我有一个大数据框,有很多条件我想运行这个计算结束)

difference_sum <- 0

for (i in x) {
  value_of_interest <- x[i] 
  difference_sum <- difference_sum  + (x[i] - x[i+1])
  difference_sum <- difference_sum  + (x[i] - x[i+2])
} 
#all the way through the end of the list

谢谢!

不确定这些是否是您要查找的值,但也许

o <- outer(dataframe$x, dataframe$x, `-`)
o[lower.tri(o)] <- NA
dataframe$y <- rowSums(o, na.rm = TRUE)
dataframe
#   x   y
# 1 1 -36
# 2 2 -28
# 3 3 -21
# 4 4 -15
# 5 5 -10
# 6 6  -6
# 7 7  -3
# 8 8  -1
# 9 9   0

您可以使用 purrr 中的 imap()

library(dplyr)
library(purrr)

df %>%
  mutate(y = imap_dbl(x, ~ sum(.x - x[-(1:.y)])))

#   x   y
# 1 1 -36
# 2 2 -28
# 3 3 -21
# 4 4 -15
# 5 5 -10
# 6 6  -6
# 7 7  -3
# 8 8  -1
# 9 9   0

如果 x 是命名向量或数据已分组,上述方法可能会中断。更安全的方法是将索引 1:n() 传递到 map2():

df %>%
  mutate(y = map2_dbl(x, 1:n(), ~ sum(.x - x[-(1:.y)])))

使用data.table:

setDT(dataframe)[, y:=rev(cumsum(rev(x)))]
dataframe[, y:=(.N:1)*x - y]
dataframe
##    x   y
## 1: 1 -36
## 2: 2 -28
## 3: 3 -21
## 4: 4 -15
## 5: 5 -10
## 6: 6  -6
## 7: 7  -3
## 8: 8  -1
## 9: 9   0