Когда mutate_all и lapply не согласны ... Как заменить lapply на mutate_all - PullRequest
0 голосов
/ 15 февраля 2019

Я снова здесь, чтобы попросить вас о помощи!Я пытаюсь выяснить, что происходит с mutate_all (или со мной ...).

Допустим, у меня есть этот набор данных:

ds <- structure(list(Q1 = structure(c(5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 
                                      5, 4, 3, 5, 5, 5, 5, 5, 1, 4, 5, 5, 3, 4, 5, 5, 5, 5, 5, 2, 5, 
                                      5, 4, 5, 5, 3, 5, 5, 4, 3, 3, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 
                                      5, 4), label = "1 Para mim é igual se os meus amigos são heterossexuais ou homossexuais.", format.spss = "F1.0", display_width = 3L, class = "labelled", labels = c(`discordo totalmente` = 1, 
                                                                                                                                                                                                          discordo = 2, indiferente = 3, concordo = 4, `concordo totalmente` = 5
                                      )), Q2 = structure(c(1, 1, 1, 1, 1, 1, 3, 1, 2, 3, 1, 4, 4, 4, 
                                                           1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 
                                                           1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 2), label = "A homossexualidade é uma perturbação psicológica/biológica.", format.spss = "F1.0", display_width = 5L, class = "labelled", labels = c(`discordo totalmente` = 1, 
                                                                                                                                                                                                                                                                     discordo = 2, indiferente = 3, concordo = 4, `concordo totalmente` = 5
                                                           )), Q3 = structure(c(5, 2, 5, 4, 5, 4, 5, 5, 5, 4, 5, 5, 2, 3, 
                                                                                5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 
                                                                                5, 5, 5, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 5, 4, 5, 4), label = "Acredito que os pais e as mães homossexuais são tão competentes como os pais e mães heterossexuais.", format.spss = "F1.0", display_width = 5L, class = "labelled", labels = c(`discordo totalmente` = 1, 
                                                                                                                                                                                                                                                                                                                                  discordo = 2, indiferente = 3, concordo = 4, `concordo totalmente` = 5
                                                                                )), Q4 = structure(c(1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 
                                                                                                     1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 2, 
                                                                                                     1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 5, 1, 1, 2, 1, 3), label = "4 Todas as Lésbicas, Gays, Bissexuais, Transexuais, Transgêneros e Intersexuais (LGBTI) me deixam irritado.", format.spss = "F1.0", display_width = 4L, class = "labelled", labels = c(`discordo totalmente` = 1, 
                                                                                                                                                                                                                                                                                                                                                               discordo = 2, indiferente = 3, concordo = 4, `concordo totalmente` = 5
                                                                                                     )), Q5 = structure(c(1, 4, 1, 1, 1, 1, 3, 1, 2, 1, 1, 1, 3, 3, 
                                                                                                                          1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 3, 2, 
                                                                                                                          1, 1, 1, 2, 2, 5, 1, 4, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 3), label = "A legalização do casamento entre pessoas do mesmo sexo é muito errada.", format.spss = "F1.0", display_width = 5L, class = "labelled", labels = c(`discordo totalmente` = 1, 
                                                                                                                                                                                                                                                                                                                                               discordo = 2, indiferente = 3, concordo = 4, `concordo totalmente` = 5
                                                                                                                          ))), row.names = c(NA, -54L), class = c("tbl_df", "tbl", "data.frame"
                                                                                                                          ))

Затем мне нужно преобразовать все переменные в факторы , чтобы построить их.Мне действительно нравится подход dplyr:

ds_mutate <- ds %>% mutate_all(., factor, levels=1:5)
likert(ds_mutate)

Но эта ошибка появляется:

Error in likert(ds_mutate) : 
  All items (columns) must have the same number of levels

STR mutate all

Когда я используюlapply (никто не убедит меня, что 'apply' функции интуитивно понятны ...), это работает довольно хорошо:

> ds_apply <- lapply(ds, factor, levels=1:5) %>% as.data.frame()
> likert(ds_apply)
  Item         1         2         3         4         5
1   Q1  1.851852  1.851852  9.259259 14.814815 72.222222
2   Q2 77.777778  9.259259  5.555556  7.407407  0.000000
3   Q3  0.000000  3.703704  1.851852 14.814815 79.629630
4   Q4 79.629630 14.814815  3.703704  0.000000  1.851852
5   Q5 72.222222  7.407407 14.814815  3.703704  1.851852

Но, как вы можете видеть, str (для меня) то же самое ... STR APPLY

Я с нетерпением жду вашего ответа !!

Спасибо!

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Я никогда не использовал пакет likert, но, похоже, он не принимает объект класса tibble.Это работает для меня:

likert(as.data.frame(ds_mutate))
0 голосов
/ 15 февраля 2019

Существует одно различие:

class(ds_mutate)
# [1] "tbl_df"     "tbl"        "data.frame"
class(ds_apply)
# [1] "data.frame"

Проблема возникает из-за того, что в вызове likert мы имеем

nlevels = length(levels(items[, 1]))

где, в первомcase,

length(levels(ds_mutate[, 1]))
# [1] 0

, так как

ds_mutate[, 1]
# A tibble: 54 x 1
#    Q1   
#    <fct>
#  1 5    
#  2 4    
#  3 5    
#  4 5    
#  5 5    
#  6 5    
#  7 5    
#  8 5    
#  9 5    
# 10 5    
# … with 44 more rows

, т.е.Кроме того,

methods("levels")
# [1] levels.default

, чтобы не было метода levels для тиблей.Также обратите внимание, что

class(ds_mutate) <- c("data.frame", "tbl_df", "tbl")
ds_mutate[, 1]
#  [1] 5 4 5 5 5 5 5 5 5 5 5 4 3 5 5 5 5 5 1 4 5 5 3 4 5 5 5 5 5 2 5 5 4 5 5 3 5 5 4 3 3 5 5 5
# [45] 5 5 5 5 5 5 5 4 5 4
# Levels: 1 2 3 4 5

, в этом случае

likert(ds_mutate)

тоже начинает работать.Без изменения классов вы также можете использовать

likert(data.frame(ds_mutate))

Extra : lapply in

lapply(ds, factor, levels = 1:5)

на самом деле действительно интуитивно понятно, когда мы понимаем одну вещь: фрейм данныхэто особый случай списка, где каждый элемент списка имеет одинаковую длину.Знайте, как работает sapply или lapply, так как он проходит по каждому элементу первого аргумента: как только мы увидим ds как фрейм данных, элементы которого (поскольку это список) являются столбцами, становится понятно, как он работает,По той же причине, поскольку результаты factor в этом случае имеют одинаковую длину, список, полученный в результате вызова lapply, можно преобразовать во фрейм данных.

...