我希望子集我的数据(grades_overall),以便所有在列CSE中值小于30的行都包含在名为lesst_than_30的新数据have中。
> 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 6NA值从哪里来?
没有观测到所有的数据都丢失了。怎么解决这个问题呢?
发布于 2019-08-10 12:05:21
我不知道这是否是重复的,但答案可以基于以下例子。
x <- c(1, NA, 3)
x[x < 2]
#[1] 1 NA
x[which(x < 2)]
#[1] 1正在发生的情况是,索引中包含NA值,其结果也将包含它们:
x < 2
#[1] TRUE NA FALSE
which(x < 2)
#[1] 1即使原始数据中没有NA,也会发生这种情况。下一个示例使用一个NA的逻辑索引,数据是完整的,但是结果有一个NA。
y <- c(1, 2, 3)
i <- c(TRUE, NA, FALSE)
y[i]
#[1] 1 NA如果NA是用which删除的,则不会。
y[which(i)]
#[1] 1发布于 2019-08-10 12:05:37
正如@Rui提到的那样,grades_overall[,19] <30对值(即NA )返回NA,当您对它们进行子集时,它返回NA行。考虑一个使用mtcars的示例
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值。
df[df[, 1] < 20 & !is.na(df[, 1]), ]或者使用默认忽略dplyr::filter值的NA。
library(dplyr)
df %>% filter(mpg < 20)https://stackoverflow.com/questions/57441917
复制相似问题