如何找到具有相同列名/行名的行的值之间的差异?
How can I find difference between value of rows with same colnames / rownames?
我想找出每组 2 个组合之间的差异,按列 A
分组。
输入数据:
A B
11 320836
11 5719750
6 29911154
6 29912280
6 29912285
下面是预期的输出:
A B C Difference
11 320836 5719750 5398914
6 29911154 29912280 1126
6 29911154 29912285 1131
6 29912280 29912285 5
#rm(list = ls())
A = c(11,11,6,6,6)
B = c(320836, 5719750, 29911154, 29912280, 29912285)
data <- cbind(A, B)
library("dplyr")
data <- as.data.frame(data)
output <- c(1,2,3)
for (i in unique(data$A)) {
numA <- i
a = unique(data[data$A == i,2])
temp <- expand.grid(a,a)
temp$A <- i
temp <- arrange(temp, Var1)
output <- rbind(output, temp)
}
output <- output[-1,] # removing 1st row you dont need.
output$diff <- output$Var1 - output$Var2
分析这个答案。我不删除对称的重复行。但我认为这个想法会对你有所帮助。
Var1 Var2 A diff
2 320836 320836 11 0
3 320836 5719750 11 -5398914
4 5719750 320836 11 5398914
5 5719750 5719750 11 0
6 29911154 29911154 6 0
7 29911154 29912280 6 -1126
8 29911154 29912285 6 -1131
9 29912280 29911154 6 1126
10 29912280 29912280 6 0
11 29912280 29912285 6 -5
12 29912285 29911154 6 1131
13 29912285 29912280 6 5
14 29912285 29912285 6 0
这是一个使用 combn 的 dplyr 选项:
df <- read.table(textConnection("
A B
11 320836
11 5719750
6 29911154
6 29912280
6 29912285 "),header=TRUE)
library(dplyr)
df2 <-
as.data.frame(df %>%
group_by(A) %>%
do(as.data.frame(t(combn(.[["B"]], 2)))))
df2$diff <- df2$V2-df2$V1
data.table 包有可能。
library(data.table)
我们可以通过在combn()
中使用diff()
快速计算差异,按A
分组。
setDT(df)[, combn(B, 2, diff), by = A]
# A V1
# 1: 11 5398914
# 2: 6 1126
# 3: 6 1131
# 4: 6 5
要获得您需要的所有列,我们可以做更多的工作。 combn()
函数可用于获取两个元素的组合。然后我们可以根据 combn()
的结果为三个新列创建一个命名列表。所有这些都按 A
.
分组
setDT(df)[, {
cmb <- combn(B, 2)
.(B = cmb[1, ], C = cmb[2, ], Diff = cmb[2, ] - cmb[1, ])
}, by = A]
# A B C Diff
# 1: 11 320836 5719750 5398914
# 2: 6 29911154 29912280 1126
# 3: 6 29911154 29912285 1131
# 4: 6 29912280 29912285 5
我想找出每组 2 个组合之间的差异,按列 A
分组。
输入数据:
A B
11 320836
11 5719750
6 29911154
6 29912280
6 29912285
下面是预期的输出:
A B C Difference
11 320836 5719750 5398914
6 29911154 29912280 1126
6 29911154 29912285 1131
6 29912280 29912285 5
#rm(list = ls())
A = c(11,11,6,6,6)
B = c(320836, 5719750, 29911154, 29912280, 29912285)
data <- cbind(A, B)
library("dplyr")
data <- as.data.frame(data)
output <- c(1,2,3)
for (i in unique(data$A)) {
numA <- i
a = unique(data[data$A == i,2])
temp <- expand.grid(a,a)
temp$A <- i
temp <- arrange(temp, Var1)
output <- rbind(output, temp)
}
output <- output[-1,] # removing 1st row you dont need.
output$diff <- output$Var1 - output$Var2
分析这个答案。我不删除对称的重复行。但我认为这个想法会对你有所帮助。
Var1 Var2 A diff
2 320836 320836 11 0
3 320836 5719750 11 -5398914
4 5719750 320836 11 5398914
5 5719750 5719750 11 0
6 29911154 29911154 6 0
7 29911154 29912280 6 -1126
8 29911154 29912285 6 -1131
9 29912280 29911154 6 1126
10 29912280 29912280 6 0
11 29912280 29912285 6 -5
12 29912285 29911154 6 1131
13 29912285 29912280 6 5
14 29912285 29912285 6 0
这是一个使用 combn 的 dplyr 选项:
df <- read.table(textConnection("
A B
11 320836
11 5719750
6 29911154
6 29912280
6 29912285 "),header=TRUE)
library(dplyr)
df2 <-
as.data.frame(df %>%
group_by(A) %>%
do(as.data.frame(t(combn(.[["B"]], 2)))))
df2$diff <- df2$V2-df2$V1
data.table 包有可能。
library(data.table)
我们可以通过在combn()
中使用diff()
快速计算差异,按A
分组。
setDT(df)[, combn(B, 2, diff), by = A]
# A V1
# 1: 11 5398914
# 2: 6 1126
# 3: 6 1131
# 4: 6 5
要获得您需要的所有列,我们可以做更多的工作。 combn()
函数可用于获取两个元素的组合。然后我们可以根据 combn()
的结果为三个新列创建一个命名列表。所有这些都按 A
.
setDT(df)[, {
cmb <- combn(B, 2)
.(B = cmb[1, ], C = cmb[2, ], Diff = cmb[2, ] - cmb[1, ])
}, by = A]
# A B C Diff
# 1: 11 320836 5719750 5398914
# 2: 6 29911154 29912280 1126
# 3: 6 29911154 29912285 1131
# 4: 6 29912280 29912285 5