R для цикла фильтрации и печати столбцов фрейма данных

#r #for-loop

Вопрос:

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

Итак, у меня есть фрейм данных, который, скажем, похож на следующий.

 sn <- 1:6
pn <- letters[1:6]
issue1_note <- c(“issue”,”# - #”,NA,”sue”,”# - #”,”ISSUE”)
issue2_note <- c(“# - #”,”ISS”,”# - #”,NA,”Issue”,”Tissue”)
df <- data.frame(sn,pn,issue1_note,issue2_note)
 

Вот что я хочу сделать. Я хочу иметь возможность быстро и легко визуально просматривать каждую колонку _note. Я знаю, что могу сделать это для каждого столбца, используя select() и filter() как в

 df %>% select(issue1_note) %>%
filter(!is.na(issue1_note) amp; issue1_note != “# - #”)
 

Однако в моих реальных данных около 30 столбцов и 300 строк, и я не хочу делать это каждый раз.

Я хотел бы написать цикл for, который будет выполнять это во всех столбцах. Я также хочу, чтобы каждая из колонок была напечатана отдельно. Я попытался ниже удалить только NAs, но он просто выбирает и печатает столбцы. Это как будто полностью пропускает фильтрацию.

 col_notes <- df %>% select(ends_with(“note”)) %>% colnames()

for(col in col_notes){
df %>% select(col) %>% filter(!is.na(col)) %>% print()
}
 

Есть какие — нибудь идеи о том, как я могу заставить это также фильтроваться?

Ответ №1:

Я смог найти решение с помощью дополнительных исследований, хотя это не связано с циклом for. Я создал пользовательскую функцию, а затем использовал lapply. На случай, если кому-то интересно, вот мое решение.

 my_fn <- function(column){
tmp <- df %>% select(column)
tmp %>% filter(!is.na(.data[[column]]) amp; .data[[column]] != “# - #”)
}

lapply(col_notes, my_fn)
 

Спасибо за внимание.

Ответ №2:

Это можно сделать сразу с filter/across помощью или filter/if_any /filter_if_all` в зависимости от желаемого результата

 library(dplyr)
df %>% 
   filter(across(ends_with('note'), ~ !is.na(.) amp; . != "# - #"))
 

Это вернет строки без NA или «# — #» во всех столбцах с суффиксом «примечание» в именах столбцов. Если мы хотим вернуть хотя бы один столбец, не содержащий NA, используйте if_any

 df %>%
    filter(if_any(ends_with("note"), ~ !is.na(.) amp; . != "# - #"))
 

Комментарии:

1. Спасибо за ответ, но ваш ответ не дает того, что я искал. Использование поперек с моими образцами данных создает фрейм данных из 1 строки (только строка 6 из оригинала), поскольку он отфильтровывает все остальное. Я хочу сохранить, а также отобразить все значения, которые не были теми, которые я отфильтровываю, а не отфильтровывать целые строки одного столбца с ненужным значением. if_any отфильтровал только строку 3 исходного df. Хотя немного дольше, комбинация пользовательской функции и lapply дала именно то, что я искал.

2. @joerminer вы имели в виду, что фильтр должен быть полностью независимым