R中奇怪的NA行为

R中奇怪的NA行为,r,R,在R中合并数据帧时,我注意到一些奇怪的行为 合并时,我在合并的数据帧中获得额外的NA行。如果显示数据帧,则不显示,并且不影响length()的输出,但在索引时会变得明显。有一个变通办法,但并不特别令人满意。我宁愿不要有这种奇怪的行为 在plyr包中使用join()时会发生这种情况,在sql查询中使用RODBC连接表时也可能发生这种情况。其他软件包也可能发生这种情况 有人能解释一下这里发生了什么以及如何避免吗?我在winXP和win8中使用RStudio,R版本3.0.1 > library

在R中合并数据帧时,我注意到一些奇怪的行为

合并时,我在合并的数据帧中获得额外的NA行。如果显示数据帧,则不显示,并且不影响
length()
的输出,但在索引时会变得明显。有一个变通办法,但并不特别令人满意。我宁愿不要有这种奇怪的行为

在plyr包中使用
join()
时会发生这种情况,在sql查询中使用RODBC连接表时也可能发生这种情况。其他软件包也可能发生这种情况

有人能解释一下这里发生了什么以及如何避免吗?我在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
>库(plyr)
>#改编自http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html
> 
>a名称(a)a
a、 身份证名称
1 1海盗
2.猴子
3 3忍者
4意大利面
> 
>b姓名(b)b
b、 身份证名称
1 1海盗
2鲁塔巴加
3达斯维德
4忍者
5忍者
> 
>z z
a、 id名称b.id
海盗1
2.猴子
3忍者4
4 3忍者5
5.4意大利面
>z$compare z#显示5行的数据帧
a、 id名称b.id比较
海盗11
2猴子
3 3忍者4 0
4 3忍者5 0
5.4意大利面条
>z[z$compare==0,]#显示行名为NA和NA.1的额外行
a、 id名称b.id比较
娜娜
3 3忍者4 0
4 3忍者5 0
NA.1 NA
> 
>z z[z$compare==0,]#保留一行
a、 id名称b.id比较
娜娜
3 3忍者4 0
4 3忍者5 0
NA.1 NA
#努力产生预期的产出
>z[z$compare==0&!is.na(z$compare),]
a、 id名称b.id比较
3 3忍者4 0
4 3忍者5 0

行子集条件返回的NA既不是真的也不是假的。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
>z$compare==0
[1] 假NA真NA
>z[NA,]
a、 id名称b.id比较
娜娜
NA.1 NA
NA.2 NA
NA.3 NA
NA.4 NA

行子集条件返回的NA既不是真的也不是假的。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
>z$compare==0
[1] 假NA真NA
>z[NA,]
a、 id名称b.id比较
娜娜
NA.1 NA
NA.2 NA
NA.3 NA
NA.4 NA

行子集条件返回的NA既不是真的也不是假的。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
>z$compare==0
[1] 假NA真NA
>z[NA,]
a、 id名称b.id比较
娜娜
NA.1 NA
NA.2 NA
NA.3 NA
NA.4 NA

行子集条件返回的NA既不是真的也不是假的。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
>z$compare==0
[1] 假NA真NA
>z[NA,]
a、 id名称b.id比较
娜娜
NA.1 NA
NA.2 NA
NA.3 NA
NA.4 NA

如果要提取
compare
等于
0
的行,必须排除
NA
情况

查看列
比较

z$compare
[1]  1 NA  0  0 NA
使用比较时,即
==
NA
s将导致
NA
s@科多雷米法在他的回答中也表明了这一点

z$compare == 0
# [1] FALSE    NA  TRUE  TRUE    NA
您应该(a)将
0
进行比较,并将
NA
进行排除!is.na()

此命令仅返回
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

与预期一样,此命令返回第一行和第五行,但也返回与索引向量中的
NA
s对应的两行
NA

如果要提取
compare
等于
0
的行,则必须排除
NA
情况

查看列
比较

z$compare
[1]  1 NA  0  0 NA
使用比较时,即
==
NA
s将导致
NA
s@科多雷米法在他的回答中也表明了这一点

z$compare == 0
# [1] FALSE    NA  TRUE  TRUE    NA
您应该(a)将
0
进行比较,并将
NA
进行排除!is.na()

此命令仅返回
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

与预期一样,此命令返回第一行和第五行,但也返回与索引向量中的
NA
s对应的两行
NA

如果要提取
compare
等于
0
的行,则必须排除
NA
情况

查看列
比较

z$compare
[1]  1 NA  0  0 NA
使用比较时,即
==
NA
s将导致
NA
s@科多雷米法在他的回答中也表明了这一点

z$compare == 0
# [1] FALSE    NA  TRUE  TRUE    NA
您应该(a)将
0
进行比较,并将
NA
进行排除!is.na()

此命令仅返回
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
的行为。

全部