我有一个包含四列的数据框 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
谢谢。
答案 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, .,`*`)))