2016-02-12 73 views
1

我有一个数据帧,如下面的数据帧,只有更多的列和一个额外的ID变量。在两列上匹配DF并乘以

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) 

任何想法或建议?

谢谢!

回答

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] 
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