#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 вы имели в виду, что фильтр должен быть полностью независимым