首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R- NA.#从何而来?

R- NA.#从何而来?
EN

Stack Overflow用户
提问于 2019-08-10 11:55:21
回答 2查看 40关注 0票数 1

我希望子集我的数据(grades_overall),以便所有在列CSE中值小于30的行都包含在名为lesst_than_30的新数据have中。

代码语言:javascript
复制
> str(grades_overall)
'data.frame':   284 obs. of  20 variables:
 $ T1             : num  10 11 10 12 9 7 8 13 11 8 ...
 $ T2             : num  10 4 10 15 13 5 14 14 16 11 ...
 $ BS             : num  12 NA NA 13 9 6 16 3 8 10 ...
 $ BT             : num  9 8 13 12 11 3 7 14 12 13 ...
 $ BC             : num  5 4 14 14 12 6 11 7 12 13 ...
 $ BM             : num  1 NA 10 11 9 5 14 9 11 11 ...
 $ D1             : num  17 NA 14 14 11 9 11 15 15 17 ...
 $ D2             : num  15 12 15 10 16 17 10 16 11 16 ...
 $ D3             : num  16 6 8 10 12 6 7 19 12 13 ...
 $ D4             : num  11 NA 14 10 18 16 10 14 12 17 ...
 $ D5             : num  16 10 14 16 15 8 6 16 16 15 ...
 $ D6             : num  12 NA 15 12 11 11 10 17 16 17 ...
 $ Total_testscore: num  7 13 11 12 11 9 13 5 9 12 ...
 $ Programme      : Factor w/ 4 levels "ArchBrus","ArchGent",..: 1 2 2 2 2 2 2 3 4 2 ...
 $ Math_GPA       : Factor w/ 5 levels "<60%",">90%",..: 4 4 1 5 1 1 3 NA NA 4 ...
 $ ID             : num  1 3 6 7 8 12 13 14 15 16 ...
 $ SE_track       : Factor w/ 3 levels "ASO","KSO","TSO": 1 1 2 3 1 1 1 2 2 2 ...
 $ Gender         : Factor w/ 2 levels "male","female": 1 1 1 1 2 2 1 2 2 2 ...
 $ CSE            : num  83 33 67 100 67 17 50 83 83 83 ...
 $ Hours_Math_SE  : num  6 3 6 4 6 4 6 2 6 6 ...
> lesst_than_30 <- grades_overall[grades_overall[,19] <30,] #41
> head(lesst_than_30)
     T1 T2 BS BT BC BM D1 D2 D3 D4 D5 D6 Total_testscore Programme Math_GPA ID SE_track Gender CSE Hours_Math_SE
6     7  5  6  3  6  5  9 17  6 16  8 11               9  ArchGent     <60% 12      ASO female  17             4
NA   NA NA NA NA NA NA NA NA NA NA NA NA              NA      <NA>     <NA> NA     <NA>   <NA>  NA            NA
29    8 NA  9  8 NA NA  9 11  7 NA NA NA               9  ArchGent     <60% 48      ASO female  17             6
NA.1 NA NA NA NA NA NA NA NA NA NA NA NA              NA      <NA>     <NA> NA     <NA>   <NA>  NA            NA
NA.2 NA NA NA NA NA NA NA NA NA NA NA NA              NA      <NA>     <NA> NA     <NA>   <NA>  NA            NA
40    4 12  6  7 13  9  6  9 11 16  9 13              10  ArchGent     <NA> 66      ASO female  17             6

NA值从哪里来?

没有观测到所有的数据都丢失了。怎么解决这个问题呢?

EN

回答 2

Stack Overflow用户

发布于 2019-08-10 12:05:21

我不知道这是否是重复的,但答案可以基于以下例子。

代码语言:javascript
复制
x <- c(1, NA, 3)

x[x < 2]
#[1]  1 NA
x[which(x < 2)]
#[1] 1

正在发生的情况是,索引中包含NA值,其结果也将包含它们:

代码语言:javascript
复制
x < 2
#[1]  TRUE    NA FALSE
which(x < 2)
#[1] 1

即使原始数据中没有NA,也会发生这种情况。下一个示例使用一个NA的逻辑索引,数据是完整的,但是结果有一个NA

代码语言:javascript
复制
y <- c(1, 2, 3)
i <- c(TRUE, NA, FALSE)
y[i]
#[1]  1 NA

如果NA是用which删除的,则不会。

代码语言:javascript
复制
y[which(i)]
#[1] 1
票数 2
EN

Stack Overflow用户

发布于 2019-08-10 12:05:37

正如@Rui提到的那样,grades_overall[,19] <30对值(即NA )返回NA,当您对它们进行子集时,它返回NA行。考虑一个使用mtcars的示例

代码语言:javascript
复制
df <- mtcars
df[1,1] <- NA

head(df[df[, 1] < 20, ])

#                   mpg cyl  disp  hp drat   wt  qsec vs am gear carb
#NA                  NA  NA    NA  NA   NA   NA    NA NA NA   NA   NA
#Hornet Sportabout 18.7   8 360.0 175 3.15 3.44 17.02  0  0    3    2
#Valiant           18.1   6 225.0 105 2.76 3.46 20.22  1  0    3    1
#Duster 360        14.3   8 360.0 245 3.21 3.57 15.84  0  0    3    4
#Merc 280          19.2   6 167.6 123 3.92 3.44 18.30  1  0    4    4
#Merc 280C         17.8   6 167.6 123 3.92 3.44 18.90  1  0    4    4

要解决这个问题,可以使用另一个条件来检查NA值。

代码语言:javascript
复制
df[df[, 1] < 20 & !is.na(df[, 1]), ]

或者使用默认忽略dplyr::filter值的NA

代码语言:javascript
复制
library(dplyr)
df %>%  filter(mpg < 20)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57441917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档