[英]Weird NA behaviour in R
在R中合并数据帧时,我注意到一些奇怪的行为。
合并时,在合并的数据框中会得到额外的NA行。 如果显示数据框且不影响length()
的输出,则不会出现,但在建立索引时会变得很明显。 有一种解决方法,但并不是特别令人满意。 我宁愿一点也不奇怪。
在plyr包中使用join()
会发生这种情况,并且在使用RODBC在sql查询中联接表时也可能发生这种情况。 其他软件包也可能发生这种情况。
谁能解释这是怎么回事以及如何避免呢? 我在winXP和win8 R版本3.0.1中使用RStudio。
> 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
如果要提取compare
等于0
那些行,则必须排除NA
情况。
看看列compare
:
z$compare
[1] 1 NA 0 0 NA
当您使用比较,即==
, NA
会导致NA
。 @Codoremifa在他的回答中也显示了这一点。
z$compare == 0
# [1] FALSE NA TRUE TRUE NA
您都应该(a)将compare
与0
进行compare
,并用!is.na()
排除NA
:
z$compare == 0 & !is.na(z$compare)
# [1] FALSE FALSE TRUE TRUE FALSE
该命令仅返回TRUE
和FALSE
。
此输出可用于子设置:
z[z$compare == 0 & !is.na(z$compare), ]
# a.id name b.id compare
# 3 3 Ninja 4 0
# 4 3 Ninja 5 0
关于NA
的行为,用于索引数据帧的行。
如果使用NA
进行索引,则所有值都将替换为NA
:
z[NA, ]
# a.id name b.id compare
# NA <NA> <NA> <NA> NA
# NA.1 <NA> <NA> <NA> NA
# NA.2 <NA> <NA> <NA> NA
# NA.3 <NA> <NA> <NA> NA
# NA.4 <NA> <NA> <NA> NA
(此行为是由于矢量回收造成的。命令与z[rep(NA, nrow(z)), ]
。
如果使用包含NA
的索引向量,则相应的行也将仅包含NA
。
例如:
z[c(TRUE, NA, FALSE, NA, TRUE), ]
# a.id name b.id compare
# 1 1 Pirate 1 1
# NA <NA> <NA> <NA> NA
# NA.1 <NA> <NA> <NA> NA
# 5 4 Spaghetti <NA> NA
如预期的那样,此命令返回第一行和第五行,但也返回与索引向量中的NA
对应的两个NA
行。
您的行子集条件返回的NA不为TRUE或FALSE。 NA行是指data.frame的第二行和第五行。
例如 -
> z$compare==0
[1] FALSE NA TRUE TRUE NA
> z[NA,]
a.id name b.id compare
NA <NA> <NA> <NA> NA
NA.1 <NA> <NA> <NA> NA
NA.2 <NA> <NA> <NA> NA
NA.3 <NA> <NA> <NA> NA
NA.4 <NA> <NA> <NA> NA
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.