выберите поднабор данных с указанными условиями c без использования функций применения и подмножества - PullRequest
2 голосов
/ 16 февраля 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

Я хотел бы выполнять эту работу без функций apply и subset.

Последний набор данных, который я хотел бы получить, это:

#    name  age income  
# 1 alicia 40  100
# 2 jessie 28  60  

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

Ответы [ 3 ]

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

Мы можем использовать subset от base R

subset(df,  age >=0 & income <= 100)
1 голос
/ 16 февраля 2020

Это, вероятно, то, что вы хотите. Нам нужно оценивать это столбец за столбцом.

df[df$age > 0 & df$age <= 100 &  df$income > 0 & df$income <= 100, ]
#     name age income
# 1 alicia  40    100
# 4 jessie  28     60

Или вы можете сделать это, если это проще. Мы использовали rowSums здесь, потому что если каждая строка удовлетворяет вашим условиям, сумма будет равна двум.

df[rowSums(df[,c(2:3)] >= 0 & df[,(2:3)] <= 100) == 2L, ]
#     name age income
# 1 alicia  40    100
# 4 jessie  28     60
0 голосов
/ 16 февраля 2020

Если использование базы R не является строгим требованием, dplyr может быть вашим другом:

library(dplyr)

df %>% 
    filter(age >= 0
           & income <= 100

#     name age income
# 1 alicia  40    100
# 2 jessie  28     60
...