簡體   English   中英

使用 lapply function 按邏輯分組

[英]Use group by logic with lapply function

我可以使用以下 function “tabyl” 形式的管理員 package 像這樣將 tabyl 應用於每一列。

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

我真正想做的是按 cyl 使用 group,然后對所有那些指定的列使用 tabyl,就像這樣(不起作用):

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

我如何將上述行放入 lapply function? 還是有其他一些按邏輯分組和使用組的方法?

請注意,我的實際數據中有數百個變量,我想將 tabyl 應用於我數據中的幾乎所有變量(至少所有數字)。 所以我需要一種在不顯式調用變量名的情況下對它們調用 tabyl 的方法!

我希望它看起來像這樣(在下面的答案中提供),除了我想包含更多變量。 想象一下 mtcars 有 104 個變量,我想將此組 tabyl 僅應用於數字變量。

    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

一種方法是這樣,雖然我不知道你是否需要 cyl 列:

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

有很多方法可以通過多個變量生成計數和頻率。 使用tables::tabular()的解決方案可以在列維度上顯示“按組”,在表格的行維度上顯示其他變量。

我們將使用mtcars數據在行維度上顯示disphp ,在列維度上顯示cyl

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

...和 output:

            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()和匿名 function 來做到這一點。

由於 OP 使用列號作為他們問題的一部分,我們將從mtcars數據框中創建一個列向量以進行制表。 我們將使用它作為lapply()的輸入,以及另外兩個 arguments,一個用於數據幀,另一個用於指定表中的列變量。 由於列變量將是單個變量,因此我們使用列名而不是數字來指定它。

# 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]]列標題的 output 表的情況下自動化該過程。 為了避免這種情況,我們使用colnames()提取行維度的列名,並通過將byVar參數粘貼到 header 中來覆蓋列的 header。

...和 output:

[[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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM