Как применить пользовательскую функцию к каждому столбцу моего фрейма данных - PullRequest
3 голосов
/ 12 мая 2019

Я пытаюсь освоить подходы tidyverse и dplyr и хочу применить следующую функцию к каждому столбцу кадра данных / таблицы данных:

library(multimode)
funx <- function(x) {multimode::modetest(x, method = 'SI') }

, а затем попробуйте использовать что-то вроде sumrize_all для начала, но я сразу получаю сообщение об ошибке:

Ошибка: столбец mpg должен иметь длину 1 (суммарное значение), а не 8

library(dplyr)

mtcars %>%
     summarise_all(funx)

В итоге я надеюсь получить новый фрейм данных, в котором показаны имена столбцов, проверенные в столбце 1, и значение p modetest в столбце 2

.

Со вчерашнего дня (23-05-2019) после обновления пакетов мое решение не работает, и следующий код теперь выводит «.» точки вместо имен столбцов отправил сообщение на страницу github, чтобы узнать причину этого изменения: github

library(multimode)
funx <- function(x) {
    print(substitute(x))
    multires <- multimode::modetest(x, method = 'SI') 
    p <- multires$p.value}

mtcars %>% 
    select(1:2) %>%
    summarise_all(list(~ funx(.)))

ОБНОВЛЕНИЕ По иронии судьбы, после получения отзыва о посте github, с новой версией мы можем теперь сделать это:

   mtcars %>%
      select(1:2) %>%
        summarise_all(funx)

Как вы видите, это тот же самый синтаксис, с которым я начал свою проблему при публикации этого вопроса. Итак, хорошая работа, что команда dplyr сделала синтаксис более «естественным», я бы сказал.

1 Ответ

4 голосов
/ 12 мая 2019

summarise может выводить только с одним элементом.В соответствии с ?summarise

Создайте одну или несколько скалярных переменных, суммирующих переменные существующей таблицы.Таблицы с группами, созданными group_by (), приведут к выводу по одной строке для каждой группы.Таблицы без групп приведут к одной строке.

, поэтому, если вывод больше длины 1, оберните его в list и unnest

library(dplyr)    
out <- mtcars %>%
          summarise_all(list(~ list(funx(.))))

Еслимы извлекаем одно значение, например p.value, тогда нет необходимости заключать его в list

out1 <- mtcars %>% 
          select(1:2) %>%
          summarise_all(list(~ funx(.)$p.value))
out1
#    mpg   cyl
#1 0.718 0.244

. Оно может быть преобразовано в набор данных из двух столбцов с gather

library(tidyr)
gather(out1, colName, pvalue) %>%
      arrange(pvalue)

Проверяя вывод modetest в одном столбце

funx(mtcars[[1]])

#   Silverman (1981) critical bandwidth test

#data:  x
#Critical bandwidth = 2.5413, p-value = 0.716
#alternative hypothesis: true number of modes is greater than 1

, это не вывод одного значения, а вывод сводной модели.Таким образом, лучше хранить в list, однако мы можем извлечь определенные компоненты (p-value) и вывести его в summarise

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...