Как удалить наблюдение из столбца, который выходит за пределы желаемого диапазона, не выходя из NA - PullRequest
2 голосов
/ 08 февраля 2012

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

df1=data.frame(c("male","female","male"),seq(1,30),seq(11,40))
names(df1) = c("col_a","col_b","col_c")

Например, удаление значений из столбца b ниже 5 или выше 20 без влияния на столбцы a или c. Затем я собираюсь использовать эти данные для описательного анализа и резюме.

В настоящее время я использую этот код для выполнения работы:

df1$col_b[df1$col_b<5|df1$col_b>20] <- ""
df1$col_b<-as.numeric(df1$col_b)

Однако это создает значения NA, которые мешают анализу. Есть ли способ сделать это, который не создает значения NA, или быстрый способ их удаления без влияния на строку?

Ответы [ 4 ]

3 голосов
/ 08 февраля 2012

Может быть, вам действительно нужно mean(..., na.rm = TRUE). Смотрите ?mean, пусть существование NA поможет вам.

3 голосов
/ 08 февраля 2012

Числовой столбец может иметь нормальные значения, NA, Inf, -Inf и NaN.Но «пустое» не является возможным значением.

Причина наличия NA заключается в том, чтобы отметить, что значение недоступно - кажется, именно то, что вы хотите!Использование отрицательного числа - просто более неуклюжий способ сделать то же самое - вам нужно удалить все отрицательные числа перед вычислением mean, sum и т. Д. ... Вы можете сделать то же самое с NA - иэта функциональность обычно встроена в функции: указав na.rm=TRUE.

df1 <- data.frame(col_a=c("male","female","male"),col_b=seq(1,30),col_c=seq(11,40))
df1$col_b[df1$col_b<5|df1$col_b>20] <- NA
sum(df1$col_b, na.rm=TRUE)    # 200
median(df1$col_b, na.rm=TRUE) # 12.5
1 голос
/ 11 мая 2012

Я понимаю, что ваше конечное намерение - "Как игнорировать выбросы в столбце для последующего анализа?"Вы не сказали, откуда взялся магический диапазон 5,20, и какого рода анализ (среднее / медиана / stdev, или что-то более сложное?).

Вы сказали: "с целью использованиястолбец в исходном кадре данных для анализа без поднабора, поскольку целью этого процесса является удаление выбросов как визуально, так и для вычисления средних значений. "

Если магические значения 5,20 получены из квантиль (например, 5-5-й квантиль, "средний 90-й квантиль"), вы можете автоматически вычислить произвольные значения квантиля с помощью quantile(df1$col_b, c(0.05,0.95)).Если вы, например, также хотите увидеть медиану, передайте вектор quantile(..., c(0.05,0.5,0.95))

Принимая во внимание, что если 5,20 - известный диапазон, используйте подход, который другие показали вам с логической индексацией илиподмножество, чтобы назначить выбросы NA.NA - твой друг для анализа;он распространяется на все расчеты так, как вы хотите.NA также ваш друг для заговора.Учись любить Н.А.Сохраните копию оригинального df (или просто оригинального df $ col_b), если позже вам понадобится получить доступ к значениям выбросов.

Если вы хотите поэкспериментировать с дистрибутивами, чтобы увидеть, какой из ваших данных следует, см. Гл. 8«Распределения вероятностей» http://cran.r -project.org / doc / manual / R-intro.pdf

Здесь все это в коде:

#inrange <- function(x,a,b) { x>=a & x<=b }
inrange_else_NA <- function(x,minmax) { ifelse((x>=minmax[1] & x<=minmax[2]), x, NA) }

# If you want to save the original col_b and modify it in-place...
#df$col_b.orig <- df$col_b
# To exclude outliers outside a known range...
df$col_b_NAs <- inrange_else_NA(df$col_b, c(5, 20))
# ... or else to exclude outliers outside (say) middle 90th quantile
middle_90th_quantile <- as.vector(quantile(df$col_b, c(0.05,0.95)))
df$col_b_NAs <- inrange_else_NA(x,middle_90th_quantile)
1 голос
/ 08 февраля 2012

Использование subset:

> df2 <- subset(df1, ! ( df1$col_b<5|df1$col_b>20) )
> df2$col_b <- as.numeric(df2$col_b)
> df2
    col_a col_b col_c
5  female     5    15
6    male     6    16
7    male     7    17
8  female     8    18
9    male     9    19
10   male    10    20
11 female    11    21
12   male    12    22
13   male    13    23
14 female    14    24
15   male    15    25
16   male    16    26
17 female    17    27
18   male    18    28
19   male    19    29
20 female    20    30
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...