基于每个表的第一列比较两个表并从主表插入子表

时间:2015-08-13 02:55:20

标签: r

我正在使用:R版本3.2.1。在Windows 10上(安装了dplyr包)
我有一张完全充满NA的主表 这是一幅画报:

 Virus    X.7    X.6  
InkLog     NA     NA  
RCrisp     NA     NA  
FCrisp     NA     NA  
ZCrisp     NA     NA  

我有另一个表具有完全相同的标题行,并包含上面第1列中看到的一些值 例如:

 Virus    X.7    X.6  
InkLog  33.00  22.00    
FCrisp  23.05 111.01  

这个较小的表始终是主表的子集(因为这个较小的表中第一列的所有值都将出现在第一个表中)。

如何创建两个表混合的行 即:它包含有值的值和不存在值的NA 这就是它最终应该看起来的样子:

 Virus    X.7    X.6  
InkLog  33.00  22.00    
RCrisp     NA     NA  
FCrisp  23.05 111.01  
ZCrisp     NA     NA  

任何指针都非常感激。此外,这是一种创建包含NA的表的有效方法,它们不包含数据(根据主表中的数据范围计算)

1 个答案:

答案 0 :(得分:0)

我认为正确的方法是由rawr发布的,但仅仅是为了完整性:

基础套餐:

df <- merge(df1, df2, all =TRUE, na.rm =TRUE )
df[!duplicated(df$Virus),]

dplyr:

library(dplyr)
full_join(df1, df2) %>% arrange(X.7) %>% distinct(Virus)
# or
full_join(df1, df2) %>% filter(!duplicated(Virus, fromLast = TRUE))

sqldf:

sqldf("SELECT min(Virus) AS Virus, [X.7], [X.6] 
      FROM (SELECT * FROM df2 AS t1
            UNION ALL
            SELECT * FROM df1 AS t2)
      GROUP BY Virus")

输出:

   Virus   X.7    X.6
1 FCrisp 23.05 111.01
2 InkLog 33.00  22.00
3 RCrisp    NA     NA
4 ZCrisp    NA     NA

数据

df1 <- structure(list(Virus = structure(c(2L, 3L, 1L, 4L), .Label = c("FCrisp", 
"InkLog", "RCrisp", "ZCrisp"), class = "factor"), X.7 = c(NA, 
NA, NA, NA), X.6 = c(NA, NA, NA, NA)), .Names = c("Virus", "X.7", 
"X.6"), class = "data.frame", row.names = c(NA, -4L))

df2 <- structure(list(Virus = structure(c(2L, 1L), .Label = c("FCrisp", 
"InkLog"), class = "factor"), X.7 = c(33, 23.05), X.6 = c(22, 
111.01)), .Names = c("Virus", "X.7", "X.6"), class = "data.frame", row.names = c(NA, 
-2L))