Почему у меня много NA, когда я пытаюсь создать поднабор данных - PullRequest
1 голос
/ 18 февраля 2020

У меня есть набор данных, как показано ниже

df<-data.frame(name=c("alicia","samantha","john","jessie"), age=c(40,-23,30,28), income=c(100, 50, 120,60))

Я пытаюсь выбрать набор данных, у которого нет отрицательного значения и значения меньше 100. Я пытался

df[(df[,c(2:3)]>=0&df[,(2:3)]<=100),]

Но я не мог удалить значения, которые больше 100, и я получил много 'NA's, как показано ниже.

 #       name age income
 # 1    alicia  40    100
 # 3      john  30    120
 # 4    jessie  28     60
 # NA     <NA>  NA     NA
 # NA.1   <NA>  NA     NA
 # NA.2   <NA>  NA     NA

Я нашел способ удалить отрицательные и 100 вышеуказанных значений с помощью функций apply и subset.

У меня вопрос, почему я получил дополнительные строки с NAs с моим кодом df[(df[,c(2:3)]>=0&df[,(2:3)]<=100),]?

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Разбейте вашу проблему на более мелкие шаги, чтобы понять, что происходит -

#1)
df[,c(2:3)] >= 0

#      age income
#[1,]  TRUE   TRUE
#[2,] FALSE   TRUE
#[3,]  TRUE   TRUE
#[4,]  TRUE   TRUE

#2)
df[,(2:3)] <= 100
#      age income
#[1,] TRUE   TRUE
#[2,] TRUE   TRUE
#[3,] TRUE  FALSE
#[4,] TRUE   TRUE

#3)
df[,c(2:3)] >= 0 & df[,(2:3)] <= 100
#      age income
#[1,]  TRUE   TRUE
#[2,] FALSE   TRUE
#[3,]  TRUE  FALSE
#[4,]  TRUE   TRUE

Выход 3) - это матрица, и теперь R пытается поднастроить строки, где присутствует TRUE, то есть номера строк

which(df[,c(2:3)] >= 0 & df[,(2:3)] <= 100)
#[1] 1 3 4 5 6 8

, но у вас есть только 4 строки в наборе данных, поэтому R добавляет все остальные строки с числом больше 4 с NA

df[c(1, 3, 4, 5, 6, 8), ]

#       name age income
#1    alicia  40    100
#3      john  30    120
#4    jessie  28     60
#NA     <NA>  NA     NA
#NA.1   <NA>  NA     NA
#NA.2   <NA>  NA     NA
1 голос
/ 18 февраля 2020

Вы можете добавить rowSums в свое подмножество, чтобы получить то, что вы хотите, так как в вашем случае вы получите матрицу для подстановки, а не вектор:

df[rowSums(df[,c(2:3)]>=0&df[,(2:3)]<=100) == 2,]
#    name age income
#1 alicia  40    100
#4 jessie  28     60
...