我在这里寻找解决方案:Multiply columns in a data frame by a vector,这里:What is the right way to multiply data frame by vector?,但它并没有真正起作用.

我想做的是一种或多或少干净的tidyverse方法,将列乘以向量,然后将这些列作为新列添加到现有数据帧中.以第一个链接中的数据为例:

c1 <- c(1,2,3)
c2 <- c(4,5,6)
c3 <- c(7,8,9)
d1 <- data.frame(c1,c2,c3)

  c1 c2 c3
1  1  4  7
2  2  5  8
3  3  6  9

v1 <- c(1,2,3)

我期望的结果是:

  c1 c2 c3 pro_c1 pro_c2 pro_c3
1  1  4  7      1      8     21
2  2  5  8      2     10     24
3  3  6  9      3     12     27

我试过:

library(tidyverse)
d1 |>
  mutate(pro = sweep(across(everything()), 2, v1, "*"))

但这里的问题是,新列实际上是我的数据框中的一个数据框.我正在努力将数据框中的数据框转换为规则列.我想,我可能会先在这个内部数据框中使用setname,然后再使用unnest,但我想知道是否有更直接的方法,在每个列上循环使用across,并向其提供v1的第一/第二/第三个元素?

(我知道我可能也可以先用三个新的相乘列创建一个独立的数据框,给它们一个唯一的名称,然后在产品的d1和df上都创建bind_cols.)

推荐答案

如果是按行,那么一个选项是c_across

library(dplyr)
library(stringr)
library(tibble)
new <- as_tibble(setNames(as.list(v1), names(d1)))
d1 %>% 
  rowwise %>% 
  mutate(c_across(everything()) * new) %>%
  rename_with(~ str_c("pro_", .x), everything()) %>%
  bind_cols(d1, .)

-输出

   1 c2 c3 pro_c1 pro_c2 pro_c3
1  1  4  7      1      8     21
2  2  5  8      2     10     24
3  3  6  9      3     12     27

或者另一个选项是map2

library(purrr)
map2_dfc(d1, v1,  `*`) %>%
   rename_with(~ str_c("pro_", .x), everything()) %>%
   bind_cols(d1, .)

-输出

 c1 c2 c3 pro_c1 pro_c2 pro_c3
1  1  4  7      1      8     21
2  2  5  8      2     10     24
3  3  6  9      3     12     27

此外,以OP的方式,它是一个data.frame列.这是可以预测的

library(tidyr)
d1 |> 
    mutate(pro = sweep(cur_data(), 2, v1, `*`)) |> 
    unpack(pro, names_sep = "_")

-输出

# A tibble: 3 × 6
     c1    c2    c3 pro_c1 pro_c2 pro_c3
  <dbl> <dbl> <dbl>  <dbl>  <dbl>  <dbl>
1     1     4     7      1      8     21
2     2     5     8      2     10     24
3     3     6     9      3     12     27

编辑:基于@deschen comments ,names_sep

R相关问答推荐

用dDeliverr用第二个表更新一个表

收件箱摘要表布局在第一列上显示子类别

R中的Fasttext langue_identification返回太多参数-如何与文本匹配?

生成具有受控相关性的x和y

如何生成包含可能条目列表而不是计数的表?

如何将log 2刻度上的数字转换为自然log

在水平条形图中zoom x_轴

如果窗口在CLARME或集团之外,则有条件领先/滞后滚动总和返回NA

跨列应用多个摘要函数:summerise_all:列表对象无法强制为double类型'

使用R中的gt对R中的html rmarkdown文件进行条件格式设置表的单元格

筛选出以特定顺序患病的个体

如何编辑gMarginal背景以匹配绘图背景?

传递ggplot2的变量作为函数参数—没有映射级别以正确填充美学

如何使用tryCatch执行语句并忽略警告?

将二进制数据库转换为频率表

您是否可以使用facet_rap设置一个较低的限制来对ggmap上的比例中断进行zoom ?

悬崖三角洲超大型群数计算导致整数溢出

如何移除GGPlot中超出与面相交的任何格网像元

`-`是否也用于数据帧,有时使用引用调用?

当由base::限定时,`[.factor`引发NextMethod错误