2017-04-05 34 views
2

我知道這很容易在SAS中完成,但我似乎無法弄清楚如何在R中完成這項工作。所以,我試圖用所有n路創建一個多路比例表。我的意思是 -R比例表包含所有N種方法?

我知道如何讓這樣的事情(這是一個由爲例):

prop_table<-as.data.frame(prop.table(table(df$Variable1,df$Variable2),1)) 
view(prop_table) 

    VariableA VariableB Freq 
    x1   y1  0.5 
    x2   y1  0.75 
    x1   y2  0.5 
    x2   y2  0.25 

但我還想比例單向......這樣的事情:

VariableA VariableB Freq 
x1     0.2 
x2     0.8 
x1   y1  0.5 
x2   y1  0.75 
x1   y2  0.5 
x2   y2  0.25 

有沒有辦法做到這一點,而無需單獨創建1路,2路,...,N路表和追加他們呢?

回答

0

我不知道任何內置的函數可以爲你做所有的組合,但是你自己編寫的代碼不是太多。這裏有這樣的功能

nprop.table <- function(x) { 
    tbls <- Map(function(n) {do.call("table", list(bquote(x[,1:.(n), drop=FALSE]), 
     dnn=bquote(names(x)[1:.(n)])))}, ncol(df):1) 
    props <- Map(function(x) as.data.frame(prop.table(x,if(length(dim(x))>1){1} else {numeric(0)})), tbls) 
    dplyr::bind_rows(props) 
} 

我們可以

df <- expand.grid(Variable1=c("x1","x2"), Variable2=c("y1","y2"))[rep(1:4, c(10,60,10,20)),] 
nprop.table(df) 
# Variable1 Variable2 Freq 
# 1  x1  y1 0.50 
# 2  x2  y1 0.75 
# 3  x1  y2 0.50 
# 4  x2  y2 0.25 
# 5  x1  <NA> 0.20 
# 6  x2  <NA> 0.80 

運行它,它使用您在傳遞data.frame的所有列。所以,如果你有三列,它應該仍然工作

nsamp <- function(x, n) sample(x, n, replace=T) 
df <- data.frame(Var1=nsamp(letters[1:3], 50), 
    Var2=nsamp(letters[4:6], 50), 
    Var3=nsamp(letters[7:8], 50)) 
nprop.table(df) 
+0

你的函數的偉大工程。然而,我有點玩弄代碼,因爲當我有兩個以上的變量時,比例並不是我想要的......它顯示的比例總數是第一個變量的每種情況 – psj

+0

似乎與你在例子中展示的一致。我不清楚你想要什麼。 – MrFlick

+0

是的,它與我的例子一致,因爲我的例子是雙向的,但我意識到它與2個以上的變量有點不同。例如,讓我們saty我也有Variable3可能的值z1和z2。我希望x1-y1-z1和x1-y1-z2的比例總和等於1.現在你的函數給出了總數與x1的情況下的比例,而不管變量2是什麼。 – psj

0

我覺得這讓你最那裏的方式:

library(janitor) 
library(dplyr) # for the %>% pipe 
mtcars %>% 
    crosstab(cyl, am) %>% 
    adorn_crosstab(denom = "row", show_totals = TRUE) 

#>  cyl   0   1 
#> 1  4 27.3% (3) 72.7% (8) 
#> 2  6 57.1% (4) 42.9% (3) 
#> 3  8 85.7% (12) 14.3% (2) 
#> 4 Total 59.4% (19) 40.6% (13) 

要讓它進入你的兩列的表格,您可以使用添加一行調用從tidyr gather

library(tidyr) 
mtcars %>% 
    crosstab(cyl, am) %>% 
    adorn_crosstab(denom = "row", show_totals = TRUE) %>% 
    gather(am, proportion, -cyl) 
#>  cyl am proportion 
#> 1  4 0 27.3% (3) 
#> 2  6 0 57.1% (4) 
#> 3  8 0 85.7% (12) 
#> 4 Total 0 59.4% (19) 
#> 5  4 1 72.7% (8) 
#> 6  6 1 42.9% (3) 
#> 7  8 1 14.3% (2) 
#> 8 Total 1 40.6% (13)