如何获得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
我想知道是否有人知道任何 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