我有两个看起来像这样的数据集(每个国家一个):
dfGermany
Country Sales Year Code
Germany 2000 2000 221
Germany 1500 2001 150
Germany 2150 2002 270
dfJapan
Country Sales Year Code
Japan 500 2000 221
Japan 750 2001 221
Japan 800 2001 270
Japan 1000 2002 270
Code
是产品的“名称”。我想做的是,如果code
和 year
匹配,则将一半的日本股票出售并添加到德国的df中。
例如,221
中产品270
和dfJapan
的销售价值的一半(250欧元和500欧元)应添加到dfGermany
的{年{1}}和2000
。但是2002
的值应该什么也不会发生,因为2001
与code
不匹配。
我尝试使用year
,但是该功能不起作用,因为数据大小不同,并且我还想同时匹配年份和值。
答案 0 :(得分:3)
我们可以在“年份”,“代码”上进行联接,然后更新“ dfGermany”的“销售”列
library(data.table)
setDT(dfGermany)[dfJapan, Sales := Sales + i.Sales/2, on = .(Year, Code)]
dfGermany
# Country Sales Year Code
#1: Germany 2250 2000 221
#2: Germany 1500 2001 150
#3: Germany 2650 2002 270
dfGermany <- structure(list(Country = c("Germany", "Germany", "Germany"),
Sales = c(2000, 1500, 2150), Year = 2000:2002, Code = c(221L,
150L, 270L)), row.names = c(NA, -3L), class = "data.frame")
dfJapan <- structure(list(Country = c("Japan", "Japan", "Japan", "Japan"
), Sales = c(500L, 750L, 800L, 1000L), Year = c(2000L, 2001L,
2001L, 2002L), Code = c(221L, 221L, 270L, 270L)),
class = "data.frame", row.names = c(NA, -4L))
答案 1 :(得分:2)
使用dplyr
和@akrun提供的数据:
library(dplyr)
dfGermany %>%
left_join(dfJapan %>%
select(Year, Code, sales_japan = Sales),
by = c('Year', 'Code')) %>%
mutate(Sales = Sales + coalesce(sales_japan / 2, 0)) %>%
select(-sales_japan)
> dfGermany
Country Sales Year Code
1 Germany 2250 2000 221
2 Germany 1500 2001 150
3 Germany 2650 2002 270