【问题标题】:Multiply each element of a special column of a data frame with the corresponding elements of other columns of the data frame将数据框特殊列的每个元素与数据框其他列的相应元素相乘
【发布时间】:2018-12-01 06:57:45
【问题描述】:

我有一个数据框 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"] 与其他每一列相乘的提示?

我希望输出是一个数据框 df1,列名为 w,x,y。

>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

谢谢。

【问题讨论】:

  • 你能澄清你的预期输出吗?你希望最终的数据框是什么(对于这个例子)?
  • 可能是lapply(df[1:3], function(x) Map("*", df$z, x)) 帮助。但正如 DanHall 提到的,目前尚不清楚您想要的预期输出如何
  • akrun 的评论给出了你想要的输出。如果你想要它作为一个 data.frame 你可以做as.data.frame(do.call(cbind, lapply(df[1:3], function(x) Map("*", df$z, x))))

标签: r dataframe apply multiplication


【解决方案1】:

我们可以使用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列是单一的,我们可以在transmute_at中使用one_of来选择除'z'之外的其他列

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    相关资源
    最近更新 更多