将数据帧的特殊列的每个元素与数据帧的其他列的对应元素相乘

时间:2018-06-21 20:37:29

标签: r dataframe apply multiplication

我有一个包含四列的数据框 df ;三个整数列和一个包含列表的特殊列:

df <- data.frame(w= 1:3, x=3:5, y=6:8, z = I(list(1:2, 1:3, 1:4)))

> df
  w x y          z
1 1 3 6       1, 2
2 2 4 7    1, 2, 3
3 3 5 8 1, 2, 3, 4

>class(df$z)
[1] "AsIs"

我想通过将列df [“ z”]的每个元素分别与其他各列(df [“ w”],df [“ x” ],df [“ y”])设置为同一数据帧 df

我发现可以使用Map(“ *”,df $ z,df $ x),但一次只能与另一列进行所需的乘法运算。我的数据集太大,无法让我以这么小的步长执行乘法。

> Map("*", df$z, df$x) 

[[1]]
[1] 3 6

[[2]]
[1]  4  8 12

[[3]]
[1]  5 10 15 20

任何人都可以提供关于如何在保留数据帧结构的同时将df [“ z”]与其他各列相乘的提示吗?

我希望输出为具有列名w,x,y的数据框 df1

>df1
w                 x                 y
1 2               3 6               6 12
2 4 6             4 8 12            7 14 21
3 6 9 12          5 10 15 20        8 16 24 32

谢谢。

1 个答案:

答案 0 :(得分:2)

我们可以使用transmute_at

library(tidyverse)
df %>% 
   transmute_at(vars(w, x, y), funs(map2(z, ., `*`)))
#           w             x             y
#1        1, 2          3, 6         6, 12
#2     2, 4, 6      4, 8, 12     7, 14, 21
#3 3, 6, 9, 12 5, 10, 15, 20 8, 16, 24, 32

或者如@Ryan所述,如果有更多列且乘数list列为单个,我们可以在one_of中使用transmute_at选择除“ z”之外的其他列

df %>%
    transmute_at(vars(-one_of('z')), funs(map2(z, .,`*`)))