我知道这很容易在SAS中完成,但我似乎无法弄清楚如何在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
有没有办法在不单独创建单向,双向... N路表并将它们全部附加的情况下执行此操作?
答案 0 :(得分: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)
答案 1 :(得分: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)