我有这样的数据框。
> 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位置是连续的时,它才会起作用。这对我来说已经足够了。如果任何人都可以拥有更广泛的解决方案,那将使我们所有人受益。
答案 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`))