我正在使用: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的表的有效方法,它们不包含数据(根据主表中的数据范围计算)
答案 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))