Использовать группу по logi c с функцией lapply - PullRequest
1 голос
/ 19 июня 2020

Я могу использовать следующую функцию "tabyl" из пакета janitor, чтобы применить tabyl к каждому столбцу.

lapply(mtcars[,2:4],tabyl)

Что я действительно хочу сделать, так это использовать группу по цилиндру, а затем использовать tabyl для всех этих указанных столбцов, что-то вроде этого (не работает):

lapply(mtcars[,2:4],tabyl(cyl))

Как я бы поместил эту строку выше в функцию lapply? Или есть другой способ группировки и использования группы по логам c?

Обратите внимание, у меня есть сотни переменных в моих фактических данных, и я хочу применить tabyl почти ко всем переменным в моем данные (все числа c минимум). Так что мне нужен способ вызова tabyl для них без явного вызова имен переменных!

Я хочу, чтобы это выглядело так (указано в ответе ниже), за исключением того, что я хочу включить МНОГО других переменных. Представьте себе, что mtcars имеет 104 переменных, и я хочу применить эту групповую таблицу только к числовым c.

    cyl                             
            4           6         8         
            n   Percent n Percent n  Percent
 disp 71.1   1    9.091 0   0.00   0   0.000
      75.7   1    9.091 0   0.00   0   0.000
      78.7   1    9.091 0   0.00   0   0.000
      79     1    9.091 0   0.00   0   0.000
      95.1   1    9.091 0   0.00   0   0.000
      108    1    9.091 0   0.00   0   0.000
      120.1  1    9.091 0   0.00   0   0.000
      120.3  1    9.091 0   0.00   0   0.000
      121    1    9.091 0   0.00   0   0.000
      140.8  1    9.091 0   0.00   0   0.000
      145    0    0.000 1  14.29   0   0.000
      146.7  1    9.091 0   0.00   0   0.000
      160    0    0.000 2  28.57   0   0.000
      167.6  0    0.000 2  28.57   0   0.000
      225    0    0.000 1  14.29   0   0.000
      258    0    0.000 1  14.29   0   0.000
      275.8  0    0.000 0   0.00   3  21.429
      301    0    0.000 0   0.00   1   7.143
      304    0    0.000 0   0.00   1   7.143
      318    0    0.000 0   0.00   1   7.143
      350    0    0.000 0   0.00   1   7.143
      351    0    0.000 0   0.00   1   7.143
      360    0    0.000 0   0.00   2  14.286
      400    0    0.000 0   0.00   1   7.143
      440    0    0.000 0   0.00   1   7.143
      460    0    0.000 0   0.00   1   7.143
      472    0    0.000 0   0.00   1   7.143
      All   11  100.000 7 100.00  14 100.000
 hp   52     1    9.091 0   0.00   0   0.000
      62     1    9.091 0   0.00   0   0.000
      65     1    9.091 0   0.00   0   0.000
      66     2   18.182 0   0.00   0   0.000
      91     1    9.091 0   0.00   0   0.000
      93     1    9.091 0   0.00   0   0.000
      95     1    9.091 0   0.00   0   0.000
      97     1    9.091 0   0.00   0   0.000
      105    0    0.000 1  14.29   0   0.000
      109    1    9.091 0   0.00   0   0.000
      110    0    0.000 3  42.86   0   0.000
      113    1    9.091 0   0.00   0   0.000
      123    0    0.000 2  28.57   0   0.000
      150    0    0.000 0   0.00   2  14.286
      175    0    0.000 1  14.29   2  14.286
      180    0    0.000 0   0.00   3  21.429
      205    0    0.000 0   0.00   1   7.143
      215    0    0.000 0   0.00   1   7.143
      230    0    0.000 0   0.00   1   7.143
      245    0    0.000 0   0.00   2  14.286
      264    0    0.000 0   0.00   1   7.143
      335    0    0.000 0   0.00   1   7.143
      All   11  100.000 7 100.00  14 100.000

Ответы [ 2 ]

1 голос
/ 19 июня 2020

Есть много способов генерировать подсчеты и частоты по нескольким переменным. Решение с tables::tabular() позволяет отображать "по группам" в измерении столбца, а другие переменные - в измерении строки таблицы.

Мы будем использовать данные mtcars для отображения disp и hp в измерении строки и cyl в измерении столбца.

library(tables)
tabular(((Factor(disp) + 1) + (Factor(hp) + 1))~(Factor(cyl))*((n=1) + Percent("col")),data = mtcars)

... и вывод:

            cyl                             
            4           6         8         
            n   Percent n Percent n  Percent
 disp 71.1   1    9.091 0   0.00   0   0.000
      75.7   1    9.091 0   0.00   0   0.000
      78.7   1    9.091 0   0.00   0   0.000
      79     1    9.091 0   0.00   0   0.000
      95.1   1    9.091 0   0.00   0   0.000
      108    1    9.091 0   0.00   0   0.000
      120.1  1    9.091 0   0.00   0   0.000
      120.3  1    9.091 0   0.00   0   0.000
      121    1    9.091 0   0.00   0   0.000
      140.8  1    9.091 0   0.00   0   0.000
      145    0    0.000 1  14.29   0   0.000
      146.7  1    9.091 0   0.00   0   0.000
      160    0    0.000 2  28.57   0   0.000
      167.6  0    0.000 2  28.57   0   0.000
      225    0    0.000 1  14.29   0   0.000
      258    0    0.000 1  14.29   0   0.000
      275.8  0    0.000 0   0.00   3  21.429
      301    0    0.000 0   0.00   1   7.143
      304    0    0.000 0   0.00   1   7.143
      318    0    0.000 0   0.00   1   7.143
      350    0    0.000 0   0.00   1   7.143
      351    0    0.000 0   0.00   1   7.143
      360    0    0.000 0   0.00   2  14.286
      400    0    0.000 0   0.00   1   7.143
      440    0    0.000 0   0.00   1   7.143
      460    0    0.000 0   0.00   1   7.143
      472    0    0.000 0   0.00   1   7.143
      All   11  100.000 7 100.00  14 100.000
 hp   52     1    9.091 0   0.00   0   0.000
      62     1    9.091 0   0.00   0   0.000
      65     1    9.091 0   0.00   0   0.000
      66     2   18.182 0   0.00   0   0.000
      91     1    9.091 0   0.00   0   0.000
      93     1    9.091 0   0.00   0   0.000
      95     1    9.091 0   0.00   0   0.000
      97     1    9.091 0   0.00   0   0.000
      105    0    0.000 1  14.29   0   0.000
      109    1    9.091 0   0.00   0   0.000
      110    0    0.000 3  42.86   0   0.000
      113    1    9.091 0   0.00   0   0.000
      123    0    0.000 2  28.57   0   0.000
      150    0    0.000 0   0.00   2  14.286
      175    0    0.000 1  14.29   2  14.286
      180    0    0.000 0   0.00   3  21.429
      205    0    0.000 0   0.00   1   7.143
      215    0    0.000 0   0.00   1   7.143
      230    0    0.000 0   0.00   1   7.143
      245    0    0.000 0   0.00   2  14.286
      264    0    0.000 0   0.00   1   7.143
      335    0    0.000 0   0.00   1   7.143
      All   11  100.000 7 100.00  14 100.000
> 

ОБНОВЛЕНИЕ: автоматизация процесса

В комментариях к моему ответу исходный постер спросил, как можно автоматизировать tabular(), чтобы не вводить все переменные для табуляции. Мы можем сделать это с помощью lapply() и анонимной функции.

Поскольку OP использовал номера столбцов как часть своего вопроса, мы создадим вектор столбцов из фрейма данных mtcars для табуляции. Мы будем использовать это в качестве входных данных для lapply() вместе с двумя другими аргументами, одним для фрейма данных, а другим для указания переменной столбца в таблице. Поскольку переменная столбца будет одной переменной, мы указали ее именем столбца, а не числом.

# generalize and automate
varList <- 2:4
lapply(varList,function(x,df,byVar){ 
         tabular((Factor(df[[x]],paste(colnames(df)[x])) + 1) ~ ((Factor(df[[byVar]],paste(byVar)))*((n=1) + Percent("col"))),
             data= df) 
  },mtcars,"cyl")

Сложная часть состоит в том, как автоматизировать процесс без выходных таблиц, имеющих заголовки строк df[[x]] и столбцы df[[byVar]]. Чтобы избежать этой ситуации, мы извлекаем имя столбца для измерения строки с помощью colnames() и перезаписываем заголовок для столбцов, вставляя аргумент byVar в заголовок.

... и вывод :

[[1]]

     cyl                             
     4           6         8         
 cyl n   Percent n Percent n  Percent
 4   11  100     0   0      0   0    
 6    0    0     7 100      0   0    
 8    0    0     0   0     14 100    
 All 11  100     7 100     14 100    

[[2]]

       cyl                             
       4           6         8         
 disp  n   Percent n Percent n  Percent
 71.1   1    9.091 0   0.00   0   0.000
 75.7   1    9.091 0   0.00   0   0.000
 78.7   1    9.091 0   0.00   0   0.000
 79     1    9.091 0   0.00   0   0.000
 95.1   1    9.091 0   0.00   0   0.000
 108    1    9.091 0   0.00   0   0.000
 120.1  1    9.091 0   0.00   0   0.000
 120.3  1    9.091 0   0.00   0   0.000
 121    1    9.091 0   0.00   0   0.000
 140.8  1    9.091 0   0.00   0   0.000
 145    0    0.000 1  14.29   0   0.000
 146.7  1    9.091 0   0.00   0   0.000
 160    0    0.000 2  28.57   0   0.000
 167.6  0    0.000 2  28.57   0   0.000
 225    0    0.000 1  14.29   0   0.000
 258    0    0.000 1  14.29   0   0.000
 275.8  0    0.000 0   0.00   3  21.429
 301    0    0.000 0   0.00   1   7.143
 304    0    0.000 0   0.00   1   7.143
 318    0    0.000 0   0.00   1   7.143
 350    0    0.000 0   0.00   1   7.143
 351    0    0.000 0   0.00   1   7.143
 360    0    0.000 0   0.00   2  14.286
 400    0    0.000 0   0.00   1   7.143
 440    0    0.000 0   0.00   1   7.143
 460    0    0.000 0   0.00   1   7.143
 472    0    0.000 0   0.00   1   7.143
 All   11  100.000 7 100.00  14 100.000

[[3]]

     cyl                             
     4           6         8         
 hp  n   Percent n Percent n  Percent
 52   1    9.091 0   0.00   0   0.000
 62   1    9.091 0   0.00   0   0.000
 65   1    9.091 0   0.00   0   0.000
 66   2   18.182 0   0.00   0   0.000
 91   1    9.091 0   0.00   0   0.000
 93   1    9.091 0   0.00   0   0.000
 95   1    9.091 0   0.00   0   0.000
 97   1    9.091 0   0.00   0   0.000
 105  0    0.000 1  14.29   0   0.000
 109  1    9.091 0   0.00   0   0.000
 110  0    0.000 3  42.86   0   0.000
 113  1    9.091 0   0.00   0   0.000
 123  0    0.000 2  28.57   0   0.000
 150  0    0.000 0   0.00   2  14.286
 175  0    0.000 1  14.29   2  14.286
 180  0    0.000 0   0.00   3  21.429
 205  0    0.000 0   0.00   1   7.143
 215  0    0.000 0   0.00   1   7.143
 230  0    0.000 0   0.00   1   7.143
 245  0    0.000 0   0.00   2  14.286
 264  0    0.000 0   0.00   1   7.143
 335  0    0.000 0   0.00   1   7.143
 All 11  100.000 7 100.00  14 100.000
1 голос
/ 19 июня 2020

Один из способов - это, хотя я не знаю, нужен ли вам столбец цил:

by(mtcars[,2:4],mtcars$cyl,lapply,tabyl)

Или аккуратный способ (я думаю, что часть списка можно улучшить):

out = mtcars[,2:4] %>% 
mutate(id=cyl) %>% 
group_by(id) %>% summarize_all(~list(tabyl(.)))

out

# A tibble: 3 x 4
     id cyl              disp              hp               
  <dbl> <list>           <list>            <list>           
1     4 <df[,3] [1 × 3]> <df[,3] [11 × 3]> <df[,3] [10 × 3]>
2     6 <df[,3] [1 × 3]> <df[,3] [5 × 3]>  <df[,3] [4 × 3]> 
3     8 <df[,3] [1 × 3]> <df[,3] [11 × 3]> <df[,3] [9 × 3]> 

out %>% filter(id==4) %>% pull(hp)
[[1]]
   . n    percent
  52 1 0.09090909
  62 1 0.09090909
  65 1 0.09090909
  66 2 0.18181818
  91 1 0.09090909
  93 1 0.09090909
  95 1 0.09090909
  97 1 0.09090909
 109 1 0.09090909
 113 1 0.09090909
...