Я знаю, что подобные вопросы уже задавались (например, Передача имен элементов списка в качестве переменных функциям внутри lapply или R - итеративно применять функцию списка переменных ), но мне не удалось найти решение для моей проблемы на основе этих сообщений.
У меня есть набор данных события (~ 100 переменных,> 2000 наблюдений), который содержит переменные с информацией об задействованных субъектах. Одна переменная может содержать только одного актера, поэтому, если в событии участвуют несколько акторов, они распределены по нескольким переменным (например, actor1 , actor2 , ...). Этих актеров можно разделить на две группы («с» и «без»). Для последующего использования, Мне нужны два списка актеров : один содержит все акторы категории «s», а второй содержит все акторы «nons». «s» состоит только из трех действующих лиц, а «не» состоит из десятков действующих лиц.
# create example data
df <- data.frame(id = c(1:8),
actor1 = c("A", "B", "D", "E", "F", "G", "H", NA),
actor2 = c("A", NA, "B", "C", "E", "I", "D", "G"))
df <-
df %>%
mutate(actor1 = as.character(actor1),
actor2 = as.character(actor2))
Поскольку сценарий, который я собираюсь подготовить, предполагается использовать в обновленных версиях набора данных в будущем,Я хотел бы максимально автоматизировать и сохранить как можно более ограниченные части скрипта, которые необходимо адаптировать. Моя идея состояла в том, чтобы создать одну функцию для каждой категории, которая извлекает акторов соответствующей категории (например, «nons») из одной переменной (например, actor1 ) в списке, а затем «зацикливает» эту функцию над другими переменными. (в идеале для семейства apply ).
Я знаю, к какой категории относится каждый актер («A», «B» и «C» - это категория «s»), что позволяетЧтобы определить правило разделения, используемое в приведенной ниже функции (команда filter ).
# create function
nons_function <- function(col) {
col_ <- enquo(col)
nons_list <-
df %>%
filter(!is.na(!!col_), !!col_ != "A", !!col_ != "B", !!col_ != "C") %>%
distinct(!!col_) %>%
pull()
nons_list
}
# create list of variables to "loop" over
actorlist <- c("actor1", "actor2")
Это приводит к следующему. Вместо двух списков актеров я получаю список, содержащий имена переменных в виде символьных строк.
> lapply(actorlist, nons_function)
[[1]]
[1] "actor1"
[[2]]
[1] "actor2"
Я хотел бы получить что-то вроде следующего:
> lapply(actorlist, nons_function)
[[1]]
[1] "D" "E" "F" "G" "H"
[[2]]
[1] "E" "I" "D" "G"
Возможно, проблема в том, как я передаю имена переменных в мою функцию в lapply . Судя по всему, моя функция не может использовать символьный ввод в качестве имен переменных. Однако я не нашел способа ни адаптировать мою функцию таким образом, чтобы она позволяла вводить символы, либо предоставить моей функции список переменных для циклического перебора таким образом, чтобы она могла переварить.
Любая помощь приветствуется!
РЕДАКТИРОВАТЬ: Первоначально я назвал актеров вводящим в заблуждение образом (имена актеров указывали, к какой категории принадлежит актер), что приводит к ответам, которые на самом деле не помогают в моем случае. Я изменил имена актеров с «s1», «s2», «nons1», «nons2» и т. Д. На «A», «B», «C» и т. Д.