R配对列索引

时间:2012-10-15 02:13:08

标签: r

说我有两个矩阵,A和B:

mth <- c(rep(1:5,2))
day <- c(rep(10,5),rep(11,5)) 
hr <- c(3,4,5,6,7,3,4,5,6,7)  
v <- c(3,4,5,4,3,3,4,5,4,3)  
A <- data.frame(cbind(mth,day,hr,v))

year <- c(2008:2012)
mth <- c(1:5)  
B <- data.frame(cbind(year,mth)) 

我想要的应该是:

mth <- c(rep(2008:2012,2))  
day <- c(rep(10,5),rep(11,5))  
hr <- c(3,4,5,6,7,3,4,5,6,7)  
v <- c(3,4,5,4,3,3,4,5,4,3)  
A <- data.frame(cbind(mth,day,hr,v)) 

基本上我需要的是更改A中的列mth与B中的列年份,也许我没有搜索到正确的关键字,我无法得到我想要的东西(我试过哪个()),请求助,谢谢。

2 个答案:

答案 0 :(得分:3)

A2 <- merge(A,B, by = "mth")[ , -1]
names(A2)[(which(names(A2)=="year"))] <- "mth"
> A2
   day hr v  mth
1   10  3 3 2008
2   11  3 3 2008
3   11  4 4 2009
4   10  4 4 2009
5   11  5 5 2010
6   10  5 5 2010
7   11  6 4 2011
8   10  6 4 2011
9   10  7 3 2012
10  11  7 3 2012

答案 1 :(得分:3)

可能最简单的解决方案是使用merge,这在很多方面等同于SQL连接:

merge(A,B)
#-----
merge(A, B)
   mth day hr v year
1    1  10  3 3 2008
2    1  11  3 3 2008
3    2  11  4 4 2009
4    2  10  4 4 2009
5    3  11  5 5 2010
6    3  10  5 5 2010
7    4  11  6 4 2011
8    4  10  6 4 2011
9    5  10  7 3 2012
10   5  11  7 3 2012

您也可以使用match这样替换mth:

A$mth <- B[match(A$mth, B$mth),1]
#-----
    mth day hr v
1  2008  10  3 3
2  2009  10  4 4
3  2010  10  5 5
4  2011  10  6 4
5  2012  10  7 3
6  2008  11  3 3
7  2009  11  4 4
8  2010  11  5 5
9  2011  11  6 4
10 2012  11  7 3

虽然有点密集,但该代码通过匹配Bmth中的两个A列来对B进行索引,然后抓取第一列。+