2012-07-11 90 views
0

样本数据:与列一个数据帧匹配行中的第二

t1 <- data.frame(
    CName=c("334","5as4","ggg","bbb"), 
    D1=c(1," ",3,1), 
    D2=c(3,4,5,5) 
) 

t2 <- data.frame(
    PName=c("zz","yy","xx","ww"), 
    `334`=c(5,6,3,5), 
    "ggg"=c(7,5,4,3), 
    `5as4`=c(9,9,1,1), 
    check.names=FALSE 
) 

生产:

t1 
    CName D1 D2 
1 334 1 3 
2 5as4  4 
3 ggg 3 5 
4 bbb 1 5 

t2 
    PName 334 ggg 5as4 
1 zz 5 7 9 
2 yy 6 5 9 
3 xx 3 4 1 
4 ww 5 3 1 

欲列t1$CName列匹配的t2列标题。

所需的输出是:

PName 334 ggg 5as4 
    D1 1 3  
    D2 3 5 4 
1 zz 5 7 9 
2 yy 6 5 9 
3 xx 3 4 1 
4 ww 5 3 1 
+0

为什么你认为记忆是一个问题吗?你会得到什么错误?你的数据帧有多大? – Andrie 2012-07-11 06:25:18

+0

@Andrie,我的数据集大小约为1000,因为我的电脑速度很慢,我担心内存是个问题。如果根据你的经验,这不是问题。你能介意教我如何做到这一点?我想我可以使用早些时候由Gsee提出的方法(http://stackoverflow.com/questions/11424232)。但我不知道如何修改它,以便根据匹配结果添加新行。你能介意帮我一把吗? – psiu 2012-07-11 06:59:37

+0

我有**完全**重写你的问题似乎有道理,并发布了一个答案,即使在旧机器上R应该很容易应付。 – Andrie 2012-07-11 07:37:01

回答

1

在我看来,你真的想与t2合并的t1转置:

第1步:创建表t1的转置副本:

tt1 <- as.data.frame(t(t1[, -1]), stringsAsFactors=FALSE) 
names(tt1) <- t1[, 1] 
tt1$PName = rownames(tt1) 

tt1 
    334 5as4 ggg bbb PName 
D1 1  3 1 D1 
D2 3 4 5 5 D2 

步骤2:合并

merge(tt1, t2, all=TRUE, sort=FALSE) 

    334 5as4 ggg PName bbb 
1 1  3 D1 1 
2 3 4 5 D2 5 
3 5 9 7 zz <NA> 
4 6 9 5 yy <NA> 
5 3 1 4 xx <NA> 
6 5 1 3 ww <NA> 

第3步:现在,所有你需要做的就是删除不需要的列。

334 5as4 ggg PName 
1 1  3 D1 
2 3 4 5 D2 
3 5 9 7 zz 
4 6 9 5 yy 
5 3 1 4 xx 
6 5 1 3 ww 

即使是1000个条目的您所陈述的数据大小这不应该是一个问题R.

+0

非常感谢。分析运行速度非常快。 – psiu 2012-07-11 09:37:48

相关问题