2017-01-19 2 views
1

с этим кодом я притворяюсь, что удаляю строки в столбце a, которые имеют слово "TRUE".R: Удаление строк, но пропустить NA

DATA2 <- DATA[!DATA$a == "TRUE”] 

Однако, у меня есть "TRUE", "FALSE" и "NA". Когда я запускаю этот код, R также удаляет NA. Как я могу пропустить это и удалить строки только с «ИСТИННЫМ»?

Я уже пытался это одно, но без успеха ...

DATA2 <- DATA[!DATA$a=='TRUE',na.rm= FALSE] 

Ошибка:

Error in `[.data.frame`(DATA, !DATA$a == "TRUE", : 
    unused argument (na.rm = FALSE) 
+0

Hi Ana: Можете ли вы рассказать нам, является ли ваша колонка переменной фактором или логической? вы должны уметь это выяснить, выполнив 'class (NIRDATA $ gh_fat_hy_outlier)' –

+0

Воспроизводимый пример поможет много, см. http://stackoverflow.com/questions/5963269/how-to-make-a-great- r-воспроизводимый пример для некоторой помощи. –

+0

Hi, Это «персонаж». –

ответ

3

Я создал некоторые воспроизводимые данные:

df <- data.frame(
    col1 = c(1:15), 
    col2=rep(c("TRUE","FALSE", "NA"),5), 
    stringsAsFactors = FALSE) 

Использование базы R, вы можете сделать это:

df2 <- df[df$col2 == "NA" | !df$col2 == "TRUE", ] 

В dplyr:

library(dplyr) 
df2 <- df %>% filter(col2 == "NA" | !col2 == "TRUE") 

Выход:

> df2 
    col1 col2 
2  2 FALSE 
3  3 NA 
5  5 FALSE 
6  6 NA 
8  8 FALSE 
9  9 NA 
11 11 FALSE 
12 12 NA 
14 14 FALSE 
15 15 NA 

// Edit: изменил NA значения строк ("NA"), поступающую в вопросе.

// Примечание:

Если вы хотите конвертировать "TRUE" в TRUE, "FALSE" на FALSE и "NA" к NA, вы можете сделать это:

df_bool <- data.frame(
    col1 = df$col1, 
    col2 = as.logical(df$col2) 
) 

С df_bool$col2 возвратит реальное логические значения вместо Строки, похожие на логические значения, могут использоваться в пределах if, без использования == для TRUE и FALSE значений:

df2 <- df_bool[!df_bool$col2 | is.na(df_bool$col2), ] 
+0

На самом деле я предпочитаю ваш ответ, он более подробно говорит о том, что он делает.Мое предложение занимает немного больше времени, чтобы понять. –

+0

спасибо, Пол! –

+0

Большое спасибо! Я новичок, код для меня совершенно новый! Он решил мою проблему :) –

0

Сначала создайте некоторые данные Пример:

set.seed(1) 
df = data.frame(x = runif(10), 
       y = runif(10), 
       z = sample(c('TRUE', 'FALSE', NA), 10, replace = TRUE), 
     stringsAsFactors = FALSE) # Force to character, and not factor 

Хитрость I используйте здесь, чтобы заменить NA на "FALSE" внутри фильтра:

df[!ifelse(is.na(df$z), 'FALSE', df$z) == 'TRUE',] 
      x   y  z 
1 0.26550866 0.2059746 <NA> 
3 0.57285336 0.6870228 FALSE 
6 0.89838968 0.4976992 FALSE 
8 0.66079779 0.9919061 FALSE 
9 0.62911404 0.3800352 <NA> 
10 0.06178627 0.7774452 FALSE 

мне очень нравится dplyr стиль программирования:

df %>% filter(ifelse(is.na(z), 'FALSE', z) != 'TRUE') 
      x   y  z 
1 0.26550866 0.2059746 <NA> 
2 0.57285336 0.6870228 FALSE 
3 0.89838968 0.4976992 FALSE 
4 0.66079779 0.9919061 FALSE 
5 0.62911404 0.3800352 <NA> 
6 0.06178627 0.7774452 FALSE