使用R中的匹配将列的子集乘以第二个数据帧中的值

时间:2020-02-20 17:22:03

标签: r match

我有一个看起来像这样的数据框

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

2 个答案:

答案 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) 

相关问题