Удаление определенных строк из фрейма данных - PullRequest
4 голосов
/ 06 июля 2011

Я работаю с некоторыми данными правительства США, которые имеют длинный список городов и почтовые индексы.После некоторой работы данные в следующем формате.

dat1 = data.frame(keyword=c("Bremen", "Brent", "Centreville, AL", "Chelsea, AL", "Bailytown, Alabama", "Calera, Alabama",
              "54023", "54024"), tag=c(rep("AlabamCity",2), rep("AlabamaCityST",2), rep("AlabamaCityState",2), rep("AlabamaZipCode",2)))
dat1

Однако есть определенные ключевые слова, которые не работают должным образом.Таким образом, в приведенном ниже примере есть два «почтовых индекса», которые помечены как «AlabamaCity» и «AlabamaCityState».По какой-то причине исходный набор данных правительства содержит несколько почтовых индексов, которые неправильно сгруппированы с другими почтовыми индексами.

dat2 = data.frame(keyword=c("Bremen", "Brent", "50143", "Chelsea, AL", "Bailytown, Alabama", "52348",
              "54023", "54024"), tag=c(rep("AlabamCity",2), rep("AlabamaCityST",2), rep("AlabamaCityState",2), rep("AlabamaZipCode",2)))
dat2

Я хотел знать, как можно перебирать весь список ключевых слов иудалите все строки с числовыми значениями (они фактически сохраняются как символьные значения), которые не имеют тега AlabamaZipCode.Таким образом, предыдущие данные должны выглядеть примерно так:

dat3 = data.frame(keyword=c("Bremen", "Brent", "Chelsea, AL", "Bailytown, Alabama", "54023", "54024"), 
          tag=c(rep("AlabamCity",2), rep("AlabamaCityST",1), rep("AlabamaCityState",1), rep("AlabamaZipCode",2)))
dat3

Кажется, что проблема в том, что есть определенные числовые значения, которые я хочу сохранить, и другие, которые я хочу удалить.Может ли кто-нибудь помочь.

Ответы [ 3 ]

10 голосов
/ 07 июля 2011

Я думаю, что два выражения grepl должны помочь:

> dat2[ !( grepl("City", dat2$tag) &  grepl("^\\d", dat2$keyword) ) , ]
             keyword              tag
1             Bremen       AlabamCity
2              Brent       AlabamCity
4        Chelsea, AL    AlabamaCityST
5 Bailytown, Alabama AlabamaCityState
7              54023   AlabamaZipCode
8              54024   AlabamaZipCode

Вы удаляете строки, в которых есть цифры в keyword и "Город" в tag

5 голосов
/ 07 июля 2011

Помогает хранить данные в виде символов, а не факторов:

dat2 <- data.frame(keyword=c("Bremen", "Brent", "50143", "Chelsea, AL", 
                             "Bailytown, Alabama", "52348", "54023", "54024"),   
                   tag=c(rep("AlabamCity",2), rep("AlabamaCityST",2), 
                         rep("AlabamaCityState",2), rep("AlabamaZipCode",2)),
                   stringsAsFactors = FALSE) ## note this bit

Теперь мы можем преобразовать keyword в числовое значение, и если это не число в символьном формате, мы получим NA:

want <- with(dat2, as.numeric(keyword))

, что дает нам это:

> (want <- with(dat2, as.numeric(keyword)))
[1]    NA    NA 50143    NA    NA 52348 54023 54024
Warning message:
In eval(expr, envir, enclos) : NAs introduced by coercion

Вы можете игнорировать предупреждение или подавить его, но не используйте его небрежно, поскольку это может маскировать проблемы:

suppressWarnings(want <- with(dat2, as.numeric(keyword)))

Последний шаг - выбрать элементы want, которые не NA и имеют keyword равными "AlabamaZipCode", которые мы используем с помощью &:

(!is.na(want) & (dat2$tag != "AlabamaZipCode"))

Это выбирает строки, которые нам не нужны, поэтому мы должны отрицать вышеупомянутое, поворачивая TRUE к FALSE и наоборот:

!(!is.na(want) & (dat2$tag != "AlabamaZipCode"))

Если сложить это вместе, то получим:

dat2[!(!is.na(want) & (dat2$tag != "AlabamaZipCode")), ]

, что дает:

> dat2[!(!is.na(want) & (dat2$tag != "AlabamaZipCode")), ]
             keyword              tag
1             Bremen       AlabamCity
2              Brent       AlabamCity
4        Chelsea, AL    AlabamaCityST
5 Bailytown, Alabama AlabamaCityState
7              54023   AlabamaZipCode
8              54024   AlabamaZipCode

Полное решение:

want <- with(dat2, as.numeric(keyword))
dat2[!(!is.na(want) & (dat2$tag != "AlabamaZipCode")), ]
2 голосов
/ 07 июля 2011

Вот один (слегка запутанный) подход, который вы можете рассмотреть. Сначала создайте столбец идентификаторов для каждой строки. Это поможет с настройкой. Во-вторых, создайте вектор тех идентификаторов, которые соответствуют вашим критериям. Наконец, установите эти идентификаторы в ваших окончательных данных.

Публикуемые вами данные по умолчанию являются факторами, а не символьными данными, поэтому я учел это. Если это отличается от ваших фактических данных, вам придется соответствующим образом скорректировать. Кроме того, когда я конвертировал данные в числовые, генерируются NA. Предупреждающее сообщение генерируется, но мы можем игнорировать это для этого бита.

#Generate an ID column
dat4$id <- 1:nrow(dat4)

#Create a vector of the id's that match your criteria'
outliers <- dat4[as.character(dat4$tag) != "AlabamaZipCode" & !(is.na(as.numeric(as.character(dat4$keyword)))) , "id"]

subset(dat4, !(id %in% outliers), select = 1:2)
             keyword              tag
1             Bremen       AlabamCity
2              Brent       AlabamCity
4        Chelsea, AL    AlabamaCityST
5 Bailytown, Alabama AlabamaCityState
7              54023   AlabamaZipCode
8              54024   AlabamaZipCode

На самом деле, вы можете сократить все это до следующего и избежать генерации идентификатора.

dat4[!(as.character(dat4$tag) != "AlabamaZipCode" & !(is.na(as.numeric(as.character(dat4$keyword))))) , ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...