Удалить несколько строк с конкретными строковыми значениями - PullRequest
0 голосов
/ 07 января 2019

У меня есть фрейм данных с несколькими сотнями столбцов. Я хотел бы удалить строки для выбранных столбцов со значениями «Элемент пропущен» или «».

См. Ниже, например. В идеале я хотел бы удалить все строки, в которых столбцы "animal" и "Insurance" содержат "пропущенный элемент" или "", но не хочу, чтобы это применялось к другим столбцам.

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

dat <- data.frame(animal=c("dog","cat","Item skipped", ""), Insurance=c("Y", "N","Item skipped",""), condition = c("",
                  "Asthma","Item skipped",""), age = rep(c(6,10), each = 2))

Ответы [ 4 ]

0 голосов
/ 07 января 2019

Использование базы R без необходимости применения дополнительных пакетов:

# Find rows that match content of 2 column cell values.
rows_to_delete <- which(dat$animal == "Item skipped" & dat$Insurance == "Item skipped")

# Delete row. 
# Add result in new dataframe [dat2].
# Keep old dataframe for comparison [dat].
dat2 <- dat[-rows_to_delete, ]
0 голосов
/ 07 января 2019

Вы можете использовать filter_at с выбранными столбцами или диапазоном столбцов

library(dplyr)

dat %>%
  filter_at(vars(animal,Insurance), all_vars(!. %in% c("Item skipped", "")))

#  animal Insurance condition age
#1    dog         Y             6
#2    cat         N    Asthma   6

Или с базой R вы можете использовать rowSums

cols <- c('animal', 'Insurance')
dat[rowSums(dat[cols] == "Item skipped" | dat[cols] == "") == 0, ]
0 голосов
/ 07 января 2019

В базе R без петли for:

dat[!rownames(dat) %in% which(dat$animal %in% c("Item skipped", "") | dat$Insurance %in% c("Item skipped", "")), ]`
0 голосов
/ 07 января 2019

Вы всегда можете сделать это с помощью цикла for, особенно если ваш набор данных маловат.

> remove_cols <- c('animal', 'Insurance') # vector of names of all columns you'll use to drop rows
> remove_vals <- c('', 'Item skipped') # values which indicate a row that should be dropped
> 
> for(col in remove_cols){
+   dat <- dat[!dat[[col]] %in% remove_vals, ]
+ }
> 
> head(dat)
  animal Insurance condition age
1    dog         Y             6
2    cat         N    Asthma   6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...