Попытка удалить данные из фрейма данных с двумя условиями - PullRequest
0 голосов
/ 07 марта 2020

Я пытаюсь удалить данные из фрейма данных на основе условий из двух столбцов.

Data1 <- Data[- grep("",Data$Item# || "12345" Data$Charge)

В основном я хотел бы удалить всю строку, если в Data$Item# нет значения, и если в Data$Charge есть значение «12345». Я могу сделать их по отдельности, но не могу их объединить.

Вот данные

Item#   Charge 
50      00000
61      12345
        12345
43      00000
        02521
7       12345

Я пытаюсь добраться до

50      00000
61      12345
43      00000 
        02521
7       12345

1 Ответ

0 голосов
/ 08 марта 2020

Есть несколько проблем с вашим кодом. Во-первых, у вас есть «#» в одном из имен столбцов, что означает, что вам нужно заключить имя столбца в кавычки; в противном случае R будет думать, что вы начинаете комментарий, и игнорирует остальную часть строки. Таким образом, ваша строка

Data1 <- Data[- grep("",Data$Item# || "12345" Data$Charge)

будет интерпретироваться как

Data1 <- Data[- grep("",Data$Item

как R, что приведет к синтаксической ошибке.

В любом случае этот синтаксис работает не так, как grep. Если вы хотите протестировать столбцы на основе нескольких регулярных выражений, вы можете использовать несколько функций grepl, каждая из которых возвращает логический вектор, и просто объединить их. Однако вы не можете использовать grep или grepl с пустой строкой, поскольку каждая строка содержит пустую строку! Вы можете проверить пустую строку, просто используя == ""

При подстановке строк, вам нужно запятую после условий и закрывающей скобки, как указывал @dcarlson.

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

Следовательно, ваш код должен быть:

Data1 <- Data[-which(Data$'Item#' == "" & grepl("12345", Data$Charge)),]
Data1
#>   Item# Charge
#> 1    50      0
#> 2    61  12345
#> 4    43      0
#> 5         2521
#> 6     7  12345

Я считаю, что это соответствует ожидаемому результату.


Используемые данные

df <- structure(list(`Item#` = c("50", "61", "", "43", "", "7"), Charge = c("0", 
"12345", "12345", "0", "2521", "12345")), row.names = c(NA, -6L
), class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...