【发布时间】:2013-12-21 12:08:02
【问题描述】:
在 R 中合并数据帧时,我注意到一些奇怪的行为。
合并时,我在合并的数据框中得到额外的 NA 行。如果显示数据框,则不会出现,并且不会影响 length() 的输出,但在索引时会变得明显。有一种解决方法,但并不是特别令人满意。我宁愿根本没有这种奇怪的行为。
使用 plyr 包中的join() 会发生这种情况,并且在使用 RODBC 连接 sql 查询中的表时也可能发生这种情况。其他软件包也可能发生这种情况。
谁能解释这里发生了什么以及如何避免它?我在 winXP 和 win8 中使用 RStudio,R 版本 3.0.1。
> library(plyr)
> # example adapted from http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html
>
> a <- as.data.frame(cbind(seq(1, 4, 1), c("Pirate", "Monkey", "Ninja", "Spaghetti")), stringsAsFactors = FALSE)
> names(a) <- c("a.id", "name")
> a
a.id name
1 1 Pirate
2 2 Monkey
3 3 Ninja
4 4 Spaghetti
>
> b <- as.data.frame(cbind(seq(1, 5, 1), c("Pirate", "Rutabaga", "Darth Vader", "Ninja", "Ninja")), stringsAsFactors = FALSE)
> names(b) <- c("b.id", "name")
> b
b.id name
1 1 Pirate
2 2 Rutabaga
3 3 Darth Vader
4 4 Ninja
5 5 Ninja
>
> z <- join(a, b, by = "name", type = "left", match = "all")
> z
a.id name b.id
1 1 Pirate 1
2 2 Monkey <NA>
3 3 Ninja 4
4 3 Ninja 5
5 4 Spaghetti <NA>
> z$compare <- ifelse(z$a.id==z$b.id, 1, 0)
> z # shows dataframe of 5 rows
a.id name b.id compare
1 1 Pirate 1 1
2 2 Monkey <NA> NA
3 3 Ninja 4 0
4 3 Ninja 5 0
5 4 Spaghetti <NA> NA
> z[z$compare==0 ,] # shows extra rows with row names of NA and NA.1
a.id name b.id compare
NA <NA> <NA> <NA> NA
3 3 Ninja 4 0
4 3 Ninja 5 0
NA.1 <NA> <NA> <NA> NA
>
> z <- z[!is.na(z$a.id),]
> z[z$compare==0 ,] # NA rows retained
a.id name b.id compare
NA <NA> <NA> <NA> NA
3 3 Ninja 4 0
4 3 Ninja 5 0
NA.1 <NA> <NA> <NA> NA
# work around to produce expected output
> z[z$compare==0 & !is.na(z$compare) ,]
a.id name b.id compare
3 3 Ninja 4 0
4 3 Ninja 5 0
【问题讨论】:
标签: r