在两列上匹配DF并乘以

时间:2016-02-12 23:59:22

标签: r

我有一个数据框,例如下面的数据框,只有更多的列和一个额外的ID变量。

data <- data.frame(year = c(rep(2014,12), rep(2015,12)), month = c(seq(1,12), seq(1,12)), value = c(rep(5,24)))

某些年/月组合的数据不正确,必须乘以下列所示期间的系数进行调整。

fix <- data.frame(year = c(2014, 2014, 2015), month = c(1, 5, 6), f = c(.9, 1.1, 12))

我目前正在通过ddply这样做,但我正在寻找更优雅的解决方案:

factorize <- function(x) {
  x$value = x$value * fix[fix$year == unique(x$year) & fix$month == unique(x$month),3]
  x
}

data2 <- ddply(data, c("year", "month"), factorize)

有任何想法或建议吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

这是一个基础R方法:

transform(merge(data, fix, all.x=TRUE), value = ifelse(is.na(f), value, value*f), f=NULL)

如果您需要更快的性能,可以使用data.table

library(data.table)
data <- merge(setDT(data), setDT(fix), all.x = TRUE, by = c("year", "month"))
data[!is.na(f), value := value*f]
data[,f := NULL]

答案 1 :(得分:0)

我认为使用dplyrifelse的一行代码可以实现目标。

data %>% mutate(fix = ifelse(  year == fix$year &
                               month == fix$month,
                               fix$f, value)) %>% select(-value)

   year month  fix
1  2014     1  0.9
2  2014     2  5.0
3  2014     3  5.0
4  2014     4  5.0
5  2014     5  1.1
6  2014     6  5.0
7  2014     7  5.0
8  2014     8  5.0
9  2014     9  5.0
10 2014    10  5.0
11 2014    11  5.0
12 2014    12  5.0
13 2015     1  5.0
14 2015     2  5.0
15 2015     3  5.0
16 2015     4  5.0
17 2015     5  5.0
18 2015     6 12.0
19 2015     7  5.0
20 2015     8  5.0
21 2015     9  5.0
22 2015    10  5.0
23 2015    11  5.0
24 2015    12  5.0