我有一个看起来像这样的数据框
data <- read.table(text="
Country A B
1 FRA 1 2
2 GER 2 1
", header=TRUE)
我有一个像这样的参考数据框
ref <- read.table(text="
Names Values
1 A 5
2 B 10
", header=TRUE)
我想将每列乘以Ref中具有相同名称的对应行(同时保留不匹配的非数字行)
结果应该是这个
> result
Country A B
1 FRA 5 20
2 GER 10 10
答案 0 :(得分:1)
我们可以对感兴趣的列(nm1)进行子集化,在match
用“名称”列命名列名称之后,再乘以复制的相应的“参考”值“ ref”,然后更新这些列< / p>
nm1 <- c("A", "B")
result <- data
result[nm1] <-data[nm1] * ref$Values[match(nm1, ref$Names)][col(data[nm1])]
result
# Country A B
#1 FRA 5 20
#2 GER 10 10
答案 1 :(得分:0)
这也是一种选择。虽然有点长,但上面建议的答案可能会更好。
library(tidyverse)
data <- data.frame(
Country = c("FRA", "GER"),
A = c(1,2),
B = c(2,1)
)
ref <- data.frame(
Names = c("A", "B"),
Values = c(5, 15)
)
data %>% pivot_longer(cols = c(A,B), values_to = c("Value"), names_to = "Names") %>%
left_join(ref, by = "Names") %>%
mutate(New_Value = Value * Values) %>%
select(-Value, -Values) %>%
pivot_wider(names_from = Names, values_from = New_Value)