2012-07-11 38 views
0
Table1 <- data.frame(CName = c("aa", "bb", "cc", "dd"), 
        number = c("X11", "X22", "X33", "X44")) 

Table2 <- data.frame(PName = c("zz", "yy", "xx", "ww"), 
        "X11" = c(5, 6, 3, 5), 
        "X22" = c(7, 5, 4, 3), 
        "X44" = c(9, 9, 1, 1)) 

我得到表1如何通过匹配列标题来组合两个表并获取缺少的数据列表?

CName number 
1 aa X11 
2 bb X22 
3 cc X33 
4 dd X44 

我得到表2

PName X11 X22 X44 
1 zz 5 7 9 
2 yy 6 5 9 
3 xx 3 4 1 
4 ww 5 3 1 

我希望得到两个文件:

(1)由表1中匹配的cname表的列标题2,我想要一个像这样的新表:

ResultsTable1

PName aa bb dd 
1 zz 5 7 9 
2 yy 6 5 9 
3 xx 3 4 1 
4 ww 5 3 1 

我也想知道缺少什么,即在这个例子中,表2中缺少cc,所以它不匹配。

ResultTable2

Table1: 
Table2: cc 

是否有做这些的任何有效的方法?

回答

2

设置比基于价值观的Table2第一列之外的列名在Table1

colnames(Table2)[-1] <- as.character(Table1[Table1[["number"]] %in% colnames(Table2)[-1], "CName"]) 
Table2 
# PName aa bb dd 
#1 zz 5 7 9 
#2 yy 6 5 9 
#3 xx 3 4 1 
#4 ww 5 3 1 

这会显示什么在Table1[["CName"]]这不是在Table2

as.character(Table1[["CName"]][!Table1[["CName"]] %in% colnames(Table2)[-1]]) 
#[1] "cc" 

colnames而这将显示Table2的新colnames中的内容,但不显示Table1[["CName"]]

as.character(colnames(Table2)[-1][!colnames(Table2)[-1] %in% Table1[["CName"]]]) 
#character(0) 

也许%in%语法的一些简单的例子可以帮助(注意,这是在?match记录和A %in% B只是为match(A, B, nomatch=0) > 0

A <- c("A", "B", "D", "E") 
B <- c("B", "C", "D") 
A %in% B 
#[1] FALSE TRUE TRUE FALSE 
!A %in% B 
#[1] TRUE FALSE FALSE TRUE 
A[A %in% B] 
#[1] "B" "D" 
A[!A %in% B] 
#[1] "A" "E" 
B[B %in% A] 
#[1] "B" "D" 
B[!B %in% A] 
#[1] "C" 

为您的数据的替代语法,我以前as.character来从factor转换为character

相关问题