【问题标题】:Comparing two tables based on first column of each and inserting from master table to child table [duplicate]根据每个表的第一列比较两个表并从主表插入到子表[重复]
【发布时间】:2015-08-13 02:55:20
【问题描述】:

我正在使用: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 的表,但它们不包含数据(根据主表中的数据域来衡量)

【问题讨论】:

  • 只需rbind(data, data) 删除重复项data[!duplicated(data$Virus), ](如果需要,还可以对data[order(data$Virus), ] 进行排序)

标签: r


【解决方案1】:

我认为 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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-29
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多