R中的列相乘

时间:2018-05-05 15:18:48

标签: r dataframe dplyr

我有这样的数据框。

> abc
   ID 1.x 2.x 1.y 2.y
1   4  10  20  30  40
2  16   5  10   5  10
3  42  16  17  18  19
4  91  20  20  20  20
5 103 103  42  56  84

如何以通用方式乘以1.x * 1.y和2.x * 2.y来创建另外两列'1'和'2'?

我正在尝试获得一个通用解决方案,其中列数可能太多。所以我想将所有x与所有y相乘。虽然x和y是固定的,但必须从数据帧中计算出n。

为简单起见,假设n也是固定的,但它是一个很大的数字。

我可以尝试的一件事是: -

abc[,c(6,7)]=abc[,c(2,3)]*abc[,c(4,5)] 只有当col位置是连续的时,它才会起作用。这对我来说已经足够了。如果任何人都可以拥有更广泛的解决方案,那将使我们所有人受益。

2 个答案:

答案 0 :(得分:2)

如果只有几个变量要相乘,我们可以通过乘以感兴趣的列来transform进行此操作

transform(abc, new1 = `1.x`*`1.y`, new2 = `2.x`*`2.y`, check.names = FALSE)
#   ID 1.x 2.x 1.y 2.y new1 new2
#1   4  10  20  30  40  300  800
#2  16   5  10   5  10   25  100
#3  42  16  17  18  19  288  323
#4  91  20  20  20  20  400  400
#5 103 103  42  56  84 5768 3528

如果我们有很多列,那么一种方法是通过获取名称的子字符串然后循环遍历split,将list数据集转换为list个data.frames。将行与do.call

相乘
abc[paste0("new", 1:2)] <- lapply(split.default(abc[-1], 
   sub("\\.[a-z]+$", "", names(abc)[-1])), function(x) do.call(`*`, x))

或另一种选择是(基于成对列乘法)

apply(aperm(array(unlist(abc[-1]), c(5, 2, 2)),
            c(3, 1, 2)), 3, matrixStats::colProds)

答案 1 :(得分:1)

Mutate将保留原始变量。 Mutate_all将允许您将数据帧中的所有列相乘。

abc %>%
  mutate(new_vary1 = `1.x`* `2.x`,
         new_vary2 = `1.y`* `2.y`) %>%
  mutate_all(funs(.*`1.x`))