Использование R: Как я могу удалить строки, когда они содержат определенные значения? - PullRequest
1 голос
/ 05 мая 2019

У меня есть таблица (737: 35), которая имеет различные значения для пропущенных наблюдений, например, NA, 0, н / д или -

Итак, таблица выглядит следующим образом:

┌────┬────┬──────┬──────┬──────┬──────┬──────┐
│ X  │ Y  │ 2010 │ 2011 │ 2012 │ 2013 │ 2014 │
├────┼────┼──────┼──────┼──────┼──────┼──────┤
│ A  │ XY │ 0    │ 0    │ 0    │ 10   │ 15   │
│ A  │ XZ │ 11   │ 13   │ n/a  │ 12   │ 14   │
│ B  │ XY │ 0    │ --   │ 0    │ 7    │ --   │
│ B  │ XZ │ 15   │ 16   │ 12   │ 13   │ 14   │
│ C  │ XY │ NA   │ NA   │ NA   │ NA   │ NA   │
│ C  │ XZ │ 8    │ 12   │ 11   │ n/a  │n/a   │
└────┴────┴──────┴──────┴──────┴──────┴──────┘

Я хочу удалить все строки, которые имеют значение NA, 0, n / a или -, поэтому я получаю только строку 5 в этом примере

Я мог бы избавиться отстроки с NA, используя is.na(), и удалили строки с 0 в столбце 2010, используя grep();Может кто-нибудь сказать мне, как я могу удалить все строки, пропущенные наблюдения простым способом?

Ответы [ 2 ]

5 голосов
/ 05 мая 2019

Можно использовать %in%, чтобы проверить, присутствуют ли значения '0', 'n / a' или '-') в столбце вместе с is.na, используя |, Reduce это к единственному логическому vector с |, чтобы проверить, имеют ли какие-либо значения в строке эти символы, отрицание (! - означает, что ни один из элементов в строке не имеет этого символа) и использовать это o для подстановки строк

i1 <- !Reduce(`|`, lapply(df1, function(x) is.na(x)| x %in% c(0, "n/a", "--")))
df2 <- df1[i1, , drop = FALSE]
#   X  Y 2010 2011 2012 2013 2014
#4 B XZ   15   16   12   13   14

Или используя filter_all

library(dplyr)
df1 %>%
     filter_all(all_vars(!(is.na(.) | . %in% c(0, "n/a", "--"))))
#   X  Y 2010 2011 2012 2013 2014
#1 B XZ   15   16   12   13   14

данные

df1 <- structure(list(X = c("A", "A", "B", "B", "C", "C"), Y = c("XY", 
"XZ", "XY", "XZ", "XY", "XZ"), `2010` = c(0L, 11L, 0L, 15L, NA, 
8L), `2011` = c("0", "13", "--", "16", NA, "12"), `2012` = c("0", 
"n/a", "0", "12", NA, "11"), `2013` = c("10", "12", "7", "13", 
NA, "n/a"), `2014` = c("15", "14", "--", "14", NA, "n/a")),
class = "data.frame", row.names = c(NA, 
-6L))
3 голосов
/ 05 мая 2019

Используйте apply для построчной проверки, находится ли какой-либо элемент этой строки в символьном векторе na.strings.Это дает логический вектор по одному элементу на строку, где TRUE означает, что соответствующая строка имеет элемент, найденный в na.strings.Отрицайте этот логический вектор и индекс df1 этим.

na.strings <- c(0, NA, "NA", "--", "n/a")
df1[ !apply(df1, 1, function(x) any(x %in% na.strings)), ]

Это не делает различия между 0 и "0" или между NA и "NA", но я подозреваю, что вы хотите, чтобы все те считались пропущенными,Если вы хотите провести различие между NA и «NA» и рассматривать только NA, но не «NA» как пропущенное, пропустите «NA» из na.strings.

Обратите внимание, что если вы читаете это из текстаЗатем вы можете указать na.strings в вашей команде read.table:

na.omit(read.table("myfile", na.strings = c("NA", "0", "n/a", "--"), ...whatever...))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...