![](/img/trans.png)
[英]How to change values across multiple columns using a value conversion dataframe in R with dplyr
[英]Multiply a set of values across a dataframe using dplyr
所以我有一个数据框如下:
ID A B C
1 .3 .3 .4
2 .1 .5 .4
3 .7 0 .3
我有以下几点:
ID VALUE
1 10
1 5
1 100
2 30
3 34
2 12
我基本上想将我的VALUE
乘以我的Df1
以产生这些变量。 因此,对于 ID 的每个实例,都会使用适当的乘数。 这里需要 Dplyr 解决方案。
我的最终目标:
ID VALUE A B C
1 10 3 3 4
1 5 1.5 1.5 2
1 100 30 30 40
2 30 3 15 12
3 34 23.8 0 10.2
2 12 1.2 6 4.8
编辑:ID 变量是一个字符
一种方法是通过ID
合并两者,然后乘以您想要的那些变量。
library(tibble)
library(dplyr)
df1 <- tribble(
~ID, ~A, ~B, ~C,
1, .3, .3, .4,
2, .1, .5, .4,
3, .7, 0, .3
)
df2 <- tribble(
~ID, ~VALUE,
1, 10,
1, 5,
1, 100,
2, 30,
3, 34,
2, 12
)
left_join(
df2, df1, by = "ID"
) %>%
mutate_at(vars(A, B, C), ~VALUE*.)
# A tibble: 6 x 5
ID VALUE A B C
<dbl> <dbl> <dbl> <dbl> <dbl>
1 1 10 3 3 4
2 1 5 1.5 1.5 2
3 1 100 30 30 40
4 2 30 3 15 12
5 3 34 23.8 0 10.2
6 2 12 1.2 6 4.8
编辑:
要一次改变所有变量,请将最后一段代码替换为:
left_join(
df2, df1, by = "ID"
) %>%
mutate(across(-c(ID, VALUE), ~VALUE*.x))
在基础 R 中,您可以执行以下操作:
n <- ncol(df1)
A <- merge(df1, df2[c(1, rep(2, n-1))])
A[2:n] * A[(2:n) + n - 1]
A B C
1 3.0 3.0 4.0
2 1.5 1.5 2.0
3 30.0 30.0 40.0
4 3.0 15.0 12.0
5 1.2 6.0 4.8
6 23.8 0.0 10.2
我们可以使用data.table
library(data.table)
nm1 <- names(df1)[-1]
setDT(df2)[setDT(df1), (nm1) := lapply(mget(paste0("i.", nm1)),
`*`, VALUE),on = .(ID)]
-输出
df2
# ID VALUE A B C
#1: 1 10 3.0 3.0 4.0
#2: 1 5 1.5 1.5 2.0
#3: 1 100 30.0 30.0 40.0
#4: 2 30 3.0 15.0 12.0
#5: 3 34 23.8 0.0 10.2
#6: 2 12 1.2 6.0 4.8
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.