我一直在尝试在 dplyr 中完成此任务,但无法弄清楚。
在一个数据框(df1)中,我有包含值的列。
|A |B |
|23 |43 |
|24 |11 |
在另一个数据框(df2)中我有值。
|Column|Value|
|A |0.12 |
|B |1.23 |
我想以某种方式将 df1 的“A”列中的每个单元格乘以 df2 中该列的给定值。看起来应该很简单,但我还没有完全弄清楚正确的语法。我怀疑我正在使用 mutate,但任何建议将不胜感激。
主要尝试在 dplyr 中完成此任务,但欢迎提出其他建议。
最佳答案
您可以使用mutate(across())
,并利用cur_column()
对第二个数据帧进行子集化
mutate(d1, across(A:B, ~.x*d2[d2$Column==cur_column(),2]))
输出
A B
<dbl> <dbl>
1 2.76 52.9
2 2.88 13.5
输入:
d1 = data.frame(A = c(23,24), B=c(43,11))
d2 = data.frame(Column = c("A","B"), Value = c(.12,1.23))
这可以扩展到任意数量的列;这是一个包含三列的输入,A、B、C。
d1 = data.frame(A = c(23,24), B=c(43,11), C=c(25,16))
d2 = data.frame(Column = c("A","B", "C"), Value = c(.12,1.23, 0.75))
mutate(d1, across(where(is.numeric), ~.x*d2[d2$Column==cur_column(),2]))
A B C
1 2.76 52.89 18.75
2 2.88 13.53 12.00
有一种更详细的方法,其中 d1 旋转更长并连接到 d2,计算完成,结果旋转_更宽。它提供相同的输出:
inner_join(d2, pivot_longer(d1,everything(), names_to = "Column", values_to = "value")) %>%
mutate(value = Value*value) %>%
select(-Value) %>%
pivot_wider(names_from=Column, values_from = value, values_fn=list) %>%
unnest(everything())
输出:
A B C
<dbl> <dbl> <dbl>
1 2.76 52.9 18.8
2 2.88 13.5 12
关于r - 将数据框中的列乘以另一个数据框中给出的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71637248/