繁体   English   中英

R中奇怪的NA行为

[英]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)将compare0进行compare ,并用!is.na()排除NA

z$compare == 0 & !is.na(z$compare)
# [1] FALSE FALSE  TRUE  TRUE FALSE

该命令仅返回TRUEFALSE

此输出可用于子设置:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM