Почему filter_at не работает в ifelse? - PullRequest
0 голосов
/ 17 сентября 2018

Я работаю с набором данных о семейных отношениях, со строкой для каждого человека и столбцами, описывающими потенциальные отношения (есть столбец отца, столбец матери, столбец супруга и т. Д.). Столбцы, с которыми у меня проблемы, - это списки детей данного индивида. У меня есть такие столбцы, как child1, child2 и т. Д.

Я хочу, чтобы конечный результат функции, которую я создаю, был меньшим набором данных, который показывает семейные отношения, сосредоточенные вокруг конкретного человека. Поскольку столбцы «child» - это те, с которыми у меня возникают трудности, я сосредоточусь на строках, которые будут включены в столбец отношений со значением «parent».

У меня есть код, который позволяет фильтровать, чтобы найти родителей любого человека в наборе данных, и когда я использую его вне функции, все работает нормально. Это дает мне родителей любого человека, чье имя я поставил вместо name, независимо от того, в каком из дочерних столбцов этот человек находится.

dataset %>%
    filter_at(vars(matches("^child\\d+$")), any_vars(. == name))

Проблема возникает, когда я пытаюсь применить этот код к своей функции. Я получаю следующее сообщение об ошибке: Error in mutate_impl(.data, dots) : Evaluation error: no applicable method for 'tbl_vars' applied to an object of class "quosures".

test_function <- function(name, dataset) {
    exact_name <- paste("^", name, "$", sep = "")
    family_data <- data.frame(
        dataset %>%
            mutate(relationship = ifelse(
                filter_at(vars(matches("^child\\d+$")), any_vars(. == exact_name)), 
                "parent", 
                "other"
            )) %>%
            filter(relationship != other))
}

Я предполагаю, что это как-то связано с использованием filter_at в ifelse. Есть ли лучший способ получить желаемые результаты?

(Выше приведена сокращенная версия моей функции; у меня есть другие операторы ifelse в функции mutate, которые дают другие отношения, но они не зависят от filter_at и работают нормально.)

...