如何找到具有相同colnames / rownames的行的值之间的差异?

时间:2016-03-11 13:42:52

标签: r diff

我想找到每组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

3 个答案:

答案 0 :(得分:5)

这里有 data.table 包的可能性。

library(data.table)

我们可以使用diff()内的combn()快速计算差异,按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

答案 1 :(得分:0)

#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

分析这个答案。我没有减少symetric重复行。但我认为这个想法会对你有帮助。

       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

答案 2 :(得分: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