2013-01-03 96 views
2

我有两个数据框,它们具有相同的3列:WeekNum,Year和Number。根据2个匹配列值将数据从一个数据框添加到另一个数据框

A <- data.frame(WeekNum=c(1,2,3,4,5,1,2,3,4,5), 
       Year=c(2000,2000,2000,2000,2000,2001,2001,2001,2001,2001), 
       Number=c(0,0,0,0,0,0,0,0,0,0)) 

B <- data.frame(WeekNum=c(1,2,3,4,1,2,6), 
       Year=c(2000,2000,2000,2000,2001,2001,2001), 
       Number=c(0,1,0,1,2,5,6)) 

我想创建一个新的数据帧使用所有WEEKNUM和年份组合从A(并且只有那些从B中也存在于A)相同的3列。当在B中同时存在WeekNum和Year组合时,我想使用来自B的数值。如果组合不存在于B中,我希望将Number值保留为0.最终,我应该有一个数据框看起来像:

> C 
    WeekNum Year Number 
1  1 2000  0 
2  2 2000  1 
3  3 2000  0 
4  4 2000  1 
5  5 2000  0 
6  1 2001  2 
7  2 2001  5 
8  3 2001  0 
9  4 2001  0 
10  5 2001  0 

回答

4

一个简单的方法是将两个data.frames AB创建id列,然后使用match

A$id <- paste(A$WeekNum, A$Year, sep=":") 
B$id <- paste(B$WeekNum, B$Year, sep=":") 

m1 <- match(A$id, B$id) 
m2 <- which(!is.na(m1)) 
A$Number[m2] <- B$Number[m1[!is.na(m1)]] 
subset(A, select=-c(id)) 

输出:(Edit:我看你改变了你的输入data.frame

WeekNum Year Number 
1  1 2000  0 
2  2 2000  1 
3  3 2000  0 
4  4 2000  1 
5  5 2000  0 
6  1 2001  2 
7  2 2001  5 
8  3 2001  0 
9  4 2001  0 
10  5 2001  0 
0

从@Arun答案之前的变化:如需要

数据绑定在一起:

result <- rbind(
A[!(paste(A$WeekNum, A$Year, sep=":") %in% paste(B$WeekNum, B$Year, sep=":")),], 
B[paste(B$WeekNum, B$Year, sep=":") %in% paste(A$WeekNum, A$Year, sep=":"),] 
) 

排序,以得到正确的顺序:

result <- result[order(result$Year,result$WeekNum),] 

    WeekNum Year Number 
51  1 2000  0 
6   2 2000  1 
7   3 2000  0 
81  4 2000  1 
5   5 2000  0 
91  1 2001  2 
101  2 2001  5 
8   3 2001  0 
9   4 2001  0 
10  5 2001  0 
相关问题