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