在R中对数据框的列进行成对减法

3

我想知道有没有一种方法可以自动化(例如循环)在我的数据中减去(X2-X1),(X3-X1),(X3-X2)并将它们作为三个新列添加到数据中?

m="
id X1 X2 X3
A  1  0  4
B  2  2  2
C  3  4  1"

data <- read.table(text = m, h = T)
2个回答

1

使用 combn

dif <- combn(data[-1], 2, \(x) x[, 2] - x[, 1])
colnames(dif) <- combn(names(data)[-1], 2, \(x) paste(x[2], x[1], sep = "-"))

cbind(data, dif)
#  id X1 X2 X3 X2-X1 X3-X1 X3-X2
#1  A  1  0  4    -1     3     4
#2  B  2  2  2     0     0     0
#3  C  3  4  1     1    -2    -3

谢谢!代码看起来有点复杂,有没有可能简化一下呢? - Reza
如果您已经知道列的索引,可以在 cols 中替换它们。否则,如果列表可以使用,可以跳过 do.call - Maël
现在要简单得多了。 - Maël
1
这非常好!+1 - M--

1

这与此问题非常相似;我们基本上只需要更改在map2_dfc中使用的函数:

library(tidyverse)

combn(names(data)[-1], 2) %>% 
  map2_dfc(.x = .[1,], .y = .[2,], 
           .f = ~transmute(data, !!paste0(.y, "-", .x) := !!sym(.y) - !!sym(.x))) %>% 
  bind_cols(data, .)

#>   id X1 X2 X3 X2-X1 X3-X1 X3-X2
#> 1  A  1  0  4    -1     3     4
#> 2  B  2  2  2     0     0     0
#> 3  C  3  4  1     1    -2    -3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接