簡體   English   中英

R 中作為數據框的分類變量頻率表

[英]Frequency Table of Categorical Variables as a Data Frame in R

我想在 R 中創建所有分類變量的頻率表作為數據框。 我想找到每個調查響應的頻率和百分比(按條件分組,以及總頻率)。 我想將其生成為數據框。

僅一個變量(“q1”)的所需頻率計數示例。 我希望數據中的大多數變量具有類似的頻率計數: 在此處輸入圖像描述

我有這樣的數據。 實際數據有更多的分類變量。

library(readr)
data_in <- read_table2("treatment_cur   q13_3   q14_1   q14_2   q14_3   q14_4   q14_5   q14_6   q14_7   q14_8   q14_9   q14_10  q14_11  q14_12  q14_13  q14_14  q14_15
Control 3   2   3   6   5   6   6   6   4   5   5   5   4   6   6   5
Control 2   4   5   6   5   6   5   5   6   4   5   5   6   5   4   6
Treatment   3   1   2   6   4   6   5   4   6   4   6   1   5   6   4   6
Control 3   2   3   6   4   6   6   6   6   6   6   6   6   5   5   6
Control NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
Control 4   6   5   6   5   6   5   6   6   5   1   1   6   5   5   6
Control 3   3   2   2   3   3   6   6   4   6   5   5   3   6   6   2
Treatment   2   3   2   3   1   3   1   1   1   3   3   3   3   3   3   1
Control 3   5   5   6   3   6   3   3   3   2   2   1   4   2   3   4
Control 2   1   1   1   1   1   4   4   1   1   1   1   1   4   4   2
Control 4   3   4   6   6   6   6   6   6   6   6   6   6   6   6   6
Control 4   2   6   6   4   6   5   6   6   5   6   5   6   6   6   6
Control 2   2   3   3   2   3   5   6   5   3   3   3   3   5   3   2
Control 3   2   4   3   4   5   4   4   5   3   3   5   4   5   5   4
Treatment   2   2   2   2   2   3   1   1   2   2   3   2   3   3   2   3
Control 4   3   3   3   5   6   6   6   6   6   6   6   6   6   6   6
Treatment   2   1   3   3   2   1   3   4   2   2   3   3   2   3   3   3
Treatment   4   2   6   4   4   2   3   5   4   5   1   1   5   4   4   5
Control 3   3   3   4   4   4   4   5   3   2   5   4   5   5   4   4
Control 4   6   6   6   6   6   6   6   6   6   6   6   5   6   6   5
Control 2   2   3   6   2   5   1   2   4   4   1   1   6   4   4   6
Treatment   4   3   3   6   6   6   6   6   6   6   6   6   6   6   6   6
Treatment   4   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6
Treatment   1   1   2   4   4   4   1   1   1   1   1   1   6   1   1   6
Treatment   3   2   3   3   2   6   6   6   6   3   3   2   4   5   5   6
Control 2   1   1   1   1   1   1   2   1   1   1   1   1   2   2   1
Control 1   3   3   3   1   1   5   5   2   4   5   5   4   1   2   5
Treatment   3   4   4   5   5   4   4   4   3   5   3   4   4   6   6   5
Control NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
Control 2   2   4   6   2   4   2   2   3   5   4   4   4   3   3   5
Treatment   1   1   2   1   1   1   1   1   6   1   1   1   6   2   3   6
Treatment   2   6   1   4   4   1   1   2   2   2   1   2   1   2   2   2
Treatment   3   3   4   4   4   6   6   5   4   6   3   5   5   6   6   4
Treatment   2   1   3   3   3   3   3   3   3   3   3   3   3   3   3   3
Control 4   3   4   6   4   6   4   5   6   3   4   4   6   6   4   6
Control 4   4   3   6   2   5   2   2   4   3   1   6   5   5   5   5
Control NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
Treatment   2   3   3   6   5   6   1   2   6   5   4   4   5   5   5   6
Control 4   6   6   6   6   6   5   5   5   5   5   6   5   5   5   5
Treatment   2   1   1   3   1   3   4   4   4   4   1   4   3   4   4   4
Treatment   2   1   3   3   3   3   4   6   5   4   5   5   4   6   6   5
Control 4   6   6   6   6   6   5   5   5   6   6   5   5   5   6   6
Control NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA
Control 4   2   2   4   2   4   6   6   6   6   4   6   5   6   6   5
Control 1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1
Treatment   3   4   2   5   5   5   6   5   5   5   5   5   5   6   6   6
Control NA  2   4   4   4   4   4   3   4   6   4   5   4   6   4   4
Control 2   2   2   3   1   3   4   1   1   1   2   1   3   3   3   3
Treatment   2   2   2   3   2   2   3   3   2   2   2   2   2   2   2   2
Control 3   3   3   6   6   6   6   6   6   6   5   6   6   6   6   6
Treatment   2   1   2   2   2   1   2   2   1   1   2   1   2   2   1   3
Treatment   4   5   5   6   6   5   5   6   5   5   4   5   5   4   4   5
Control 3   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2
Treatment   3   3   4   4   4   6   3   2   5   3   2   2   5   6   5   6
Control 4   4   3   3   6   3   6   6   3   2   4   4   4   4   4   4
Treatment   4   1   3   4   4   4   5   6   6   6   6   6   6   6   6   6
Control 4   4   5   6   5   5   4   6   6   6   6   5   6   6   6   6
Treatment   3   3   4   6   6   6   6   6   5   6   6   5   4   6   6   4
Control 4   4   6   6   4   6   6   6   6   4   4   3   5   6   6   6
Control 4   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6
Treatment   4   5   5   6   6   6   6   6   5   5   6   6   5   5   6   6
Treatment   4   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6
Control 2   1   2   1   1   1   1   3   1   4   4   1   1   1   1   1
Treatment   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1
Treatment   4   6   5   5   5   5   5   6   5   4   5   4   4   5   5   4
Treatment   4   6   6   6   6   6   6   6   6   6   6   6   6   6   6   6
Control 4   4   4   4   4   4   4   4   4   4   4   4   4   4   4   4
Treatment   4   5   6   6   6   5   6   6   6   5   6   6   6   6   6   6
Control 2   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2
Treatment   3   3   2   5   4   4   5   6   6   4   5   5   4   5   4   6
Treatment   4   5   4   4   4   5   5   6   4   5   4   3   6   6   6   6
Control 1   2   3   2   1   4   1   1   3   1   3   3   3   3   4   4
Control 3   6   6   6   6   6   5   1   5   6   5   6   6   6   6   6
Control 1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1
Control 4   2   2   2   2   2   2   2   2   2   2   2   2   2   2   2
")

我目前的解決方案太復雜了。 如果我想知道 q13_3:q14_9 中變量的頻率,我知道我可以這樣做來找到它:

library(tables)
varList <- 2:11
data_in[varList] <- lapply(data_in[varList], factor,exclude = NULL)

  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) 
  },data_in,"treatment_cur") 

下面是我當前 output 的樣子的片段。 問題是 output 是無法導出到單個 excel 表中的列表的列表。 我必須手動將控制台中的所有內容復制到 excel 文件中。

       treatment_cur                          
       Control               Treatment        
 q14_8 n             Percent n         Percent
 1      6             13.953  4         12.50 
 2      4              9.302  4         12.50 
 3      5             11.628  2          6.25 
 4      6             13.953  4         12.50 
 5      5             11.628  7         21.88 
 6     13             30.233 11         34.38 
 NA     4              9.302  0          0.00 
 All   43            100.000 32        100.00 

[[10]]
                                              
       treatment_cur                          
       Control               Treatment        
 q14_9 n             Percent n         Percent
 1      6             13.953  4         12.50 
 2      6             13.953  4         12.50 
 3      4              9.302  4         12.50 
 4      6             13.953  5         15.62 
 5      5             11.628  8         25.00 
 6     12             27.907  7         21.88 
 NA     4              9.302  0          0.00 
 All   43            100.000 32        10

這工作正常,但我想:

  1. 找到每個變量值的總頻率(治療+條件)作為附加列(如上圖所示);
  2. 我不喜歡我用來生產這個 output 的 function。 我想將它導出到 excel 文件中,但是由於這個 output 實際上是一個列表列表(它不能導出到 excel),我發現將這些值從控制台復制並粘貼到 ZBF57CZ306FA7D28BB666D061 中非常麻煩我想要一種更簡單的方法來找到這些頻率。 當然 R 有更好的方法來做到這一點......

任何幫助深表感謝!!

一種方法是使用gtsummary package 進行探索。

使用上面的代碼,您可以很容易地生成一個帶有計數和百分比的表格:

library(gtsummary)
library(readr)
library(flextable)


tbl_summary(data_in, by = "treatment_cur") %>% 
    add_overall() %>% 
    as_flex_table() %>% 
    flextable::save_as_docx(., path = "G:/test.docx")

如果你只是運行:

tbl_summary(data_in, by = "treatment_cur") %>% 
        add_overall()

您將看到它為您生成的表格。 之后的額外代碼使其能夠導出到 docx 文件。 從那里您可以將其復制到 excel 中。 這會生成您請求的計數,您可以確定它是否是一個更簡單的實現。

另一種選擇是直接寫入 csv 文件:

tbl_summary(data_in, by = "treatment_cur") %>% 
    add_overall() %>% 
    as_tibble() %>% 
    readr::write_csv( .,path = "G:/test.csv")

或者,如果您真的需要單獨列中的所有內容,您可以將 n 和百分比分成兩個表,合並它們,然后寫入 csv。

#keep counts only
ncount <- tbl_summary(data_in, by = "treatment_cur",
            statistic = all_categorical()~ "{n}") %>% 
    add_overall() 

#keep pcts only

pctdata <- tbl_summary(data_in, by = "treatment_cur",
            statistic = all_categorical()~ "{p}%") %>% 
  add_overall() 
#combine and output

tbl_merge(list(ncount, pctdata)) %>% 
      as_tibble() %>% 
      readr::write_csv(., "G:/test2.csv")

編輯:解決此問題的另一種方法是使用看門人 package。 您可以很容易地修飾計數和百分比並將數據集合並在一起。 之后很容易導出到 csv/Excel。 這里的一個缺點是您必須遍歷變量以獲取每個變量的表,然后將它們組合在一起,但是下面的代碼是創建它的良好開始:

library(janitor)


datatry <- data_in %>% 
          janitor::tabyl( q13_3,treatment_cur) %>% 
          adorn_totals("col") %>% 
          adorn_totals("row")

datatry2 <- data_in %>% 
  janitor::tabyl( q13_3,treatment_cur) %>% 
  janitor::adorn_percentages(denominator = 'col') %>% 
  adorn_totals("row") %>% 
  adorn_totals("col") %>% 
  mutate(Total = ifelse(is.na(q13_3), Total, ifelse(q13_3 == 'Total',1, Total)))

datatry3 <- inner_join(datatry, datatry2, by = 'q13_3') %>%
            mutate(variable ='q13_3')

假設您如上所述構造了data_in

library(dplyr)
library(purrr)

# reformat
tt <- data_in$treatment_cur
data_in$treatment_cur <- NULL

data_in %>% map(function(a)
{
    ret <- data.frame(Treatment.n=rep(0, 6), Control.n=rep(0, 6))
    b <- table(a[tt=="Treatment"])
    ret[names(b), "Treatment.n"] <- b
    b <- table(a[tt=="Control"])
    ret[names(b), "Control.n"] <- b
    ret$Treatment.percent <- ret$Treatment.n / sum(ret$Treatment.n)
    ret$Control.percent <- ret$Control.n / sum(ret$Control.n)
    ret
}) %>% do.call(what=cbind)

它假設答案數據是 \in 1..6 並且 NA 被忽略。

暫無
暫無

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

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