直接将数据帧转换为列联表 (R)
Directly Converting Data Frames into Contingency Tables (R)
我正在使用 R。
鉴于我生成的以下随机数据,我能够使用这些数据做出应急 table:
library(memisc)
library(dplyr)
set.seed(123)
v1 <- c("2010-2011","2011-2012", "2012-2013", "2013-2014", "2014-2015")
v2 <- c("A", "B", "C", "D", "E")
v3 <- c("Z", "Y", "X", "W" )
v4 <- c("data_1", "data_2", "data_3", "data_4" )
dates <- as.factor(sample(v1, 1000, replace=TRUE, prob=c(0.5, 0.2, 0.1, 0.1, 0.1)))
types <- as.factor(sample(v2,1000, replace=TRUE, prob=c(0.3, 0.2, 0.1, 0.1, 0.1)))
types2 <- as.factor(sample(v3, 1000, replace=TRUE, prob=c(0.3, 0.5, 0.1, 0.1)))
names <- as.factor(sample(v3, 1000, replace=TRUE, prob=c(0.3, 0.5, 0.1, 0.1)))
var = rnorm(1000,10,10)
problem_data = data.frame(var,dates, types, types2, names)
summary <- xtabs(~dates+names+types+types2, problem_data)
t = ftable(summary, row.vars=1, col.vars=2:4)
show_html(t)
是否可以直接从数据帧中生成类似于 table 的应急 table?
例如,假设我想做上面的意外事件 table,但是我不想用“counts”填充这个 table,我想填充 table 与“var”的平均值。使用“dplyr”库,我可以创建一个数据框,其中包含此意外事件 table:
所需的所有值
library(dplyr)
contingency_table = data.frame(problem_data %>% group_by(dates,names, types, types2) %>% summarise(mean_value = mean(var)))
head(contingency_table)
dates names types types2 mean_value
1 2010-2011 W A X -10.128687
2 2010-2011 W A Y 9.552724
3 2010-2011 W A Z 9.686354
4 2010-2011 W B W -4.411400
5 2010-2011 W B Y 13.624970
6 2010-2011 W B Z 7.008089
能否将上述数据框制作成偶发事件table,然后转换为html可发布格式?
在这里使用这个 Whosebug post (Is there an (easy) way to convert flat contingency tables (ftable) to flextable),我尝试使用提供的函数将这个数据帧转换成一个应急事件 table - 但它没有给出期望的结果(即它与上面的 table 不同):
ftable_to_flextable <- function( x ){
row.vars = attr( x, "row.vars" )
col.vars = attr( x, "col.vars" )
rows <- rev( expand.grid( rev(row.vars), stringsAsFactors = FALSE ) )
cols <- rev(expand.grid( rev(col.vars), stringsAsFactors = FALSE ))
xmat <- as.matrix(x)
cols$col_keys = dimnames(xmat)[[2]]
xdata <- cbind(
data.frame(rows, stringsAsFactors = FALSE),
data.frame(xmat, stringsAsFactors = FALSE)
)
names(xdata) <- c(names(row.vars), cols$col_keys)
ft <- regulartable(xdata)
ft <- set_header_df(ft, cols)
ft <- theme_booktabs(ft)
ft <- merge_v(ft, j = names(row.vars))
ft
}
library(flextable)
library(magrittr)
ftable(contingency_table, row.vars = 1:2, col.vars = 3:4) %>% ftable_to_flextable()
是否可以做出意外事件 table,而不是计数,而是使用每个组的变量“var”的平均值?使用 xtabs() 函数是否更好,我使用“数据框方法”使它过于复杂?有人可以告诉我怎么做吗?
谢谢!
通用交叉制表方法在 R 中称为 tapply
。您可以阅读更多详细信息 here。例如,您可以
tapply(problem_data$var, problem_data[, -1L], mean)
这为您提供了类似于 xtabs(~dates + types + types2 + names, data = problem_data)
的内容,只是单元格中的所有值现在都是组均值。你可以这样做
smy <- tapply(problem_data$var, problem_data[, -1L], mean)
x <- ftable(smy, row.vars = c(4L, 1L), col.vars = 2:3) # var 1 is the first var you see in names(problem_data[, -1L])
y <- ftable(smy, row.vars = 1L, col.vars = c(4L, 2:3))
并且memisc::show_html(x)
给出
memisc::show_html(y)
给出
我正在使用 R。
鉴于我生成的以下随机数据,我能够使用这些数据做出应急 table:
library(memisc)
library(dplyr)
set.seed(123)
v1 <- c("2010-2011","2011-2012", "2012-2013", "2013-2014", "2014-2015")
v2 <- c("A", "B", "C", "D", "E")
v3 <- c("Z", "Y", "X", "W" )
v4 <- c("data_1", "data_2", "data_3", "data_4" )
dates <- as.factor(sample(v1, 1000, replace=TRUE, prob=c(0.5, 0.2, 0.1, 0.1, 0.1)))
types <- as.factor(sample(v2,1000, replace=TRUE, prob=c(0.3, 0.2, 0.1, 0.1, 0.1)))
types2 <- as.factor(sample(v3, 1000, replace=TRUE, prob=c(0.3, 0.5, 0.1, 0.1)))
names <- as.factor(sample(v3, 1000, replace=TRUE, prob=c(0.3, 0.5, 0.1, 0.1)))
var = rnorm(1000,10,10)
problem_data = data.frame(var,dates, types, types2, names)
summary <- xtabs(~dates+names+types+types2, problem_data)
t = ftable(summary, row.vars=1, col.vars=2:4)
show_html(t)
是否可以直接从数据帧中生成类似于 table 的应急 table?
例如,假设我想做上面的意外事件 table,但是我不想用“counts”填充这个 table,我想填充 table 与“var”的平均值。使用“dplyr”库,我可以创建一个数据框,其中包含此意外事件 table:
所需的所有值library(dplyr)
contingency_table = data.frame(problem_data %>% group_by(dates,names, types, types2) %>% summarise(mean_value = mean(var)))
head(contingency_table)
dates names types types2 mean_value
1 2010-2011 W A X -10.128687
2 2010-2011 W A Y 9.552724
3 2010-2011 W A Z 9.686354
4 2010-2011 W B W -4.411400
5 2010-2011 W B Y 13.624970
6 2010-2011 W B Z 7.008089
能否将上述数据框制作成偶发事件table,然后转换为html可发布格式?
在这里使用这个 Whosebug post (Is there an (easy) way to convert flat contingency tables (ftable) to flextable),我尝试使用提供的函数将这个数据帧转换成一个应急事件 table - 但它没有给出期望的结果(即它与上面的 table 不同):
ftable_to_flextable <- function( x ){
row.vars = attr( x, "row.vars" )
col.vars = attr( x, "col.vars" )
rows <- rev( expand.grid( rev(row.vars), stringsAsFactors = FALSE ) )
cols <- rev(expand.grid( rev(col.vars), stringsAsFactors = FALSE ))
xmat <- as.matrix(x)
cols$col_keys = dimnames(xmat)[[2]]
xdata <- cbind(
data.frame(rows, stringsAsFactors = FALSE),
data.frame(xmat, stringsAsFactors = FALSE)
)
names(xdata) <- c(names(row.vars), cols$col_keys)
ft <- regulartable(xdata)
ft <- set_header_df(ft, cols)
ft <- theme_booktabs(ft)
ft <- merge_v(ft, j = names(row.vars))
ft
}
library(flextable)
library(magrittr)
ftable(contingency_table, row.vars = 1:2, col.vars = 3:4) %>% ftable_to_flextable()
是否可以做出意外事件 table,而不是计数,而是使用每个组的变量“var”的平均值?使用 xtabs() 函数是否更好,我使用“数据框方法”使它过于复杂?有人可以告诉我怎么做吗?
谢谢!
通用交叉制表方法在 R 中称为 tapply
。您可以阅读更多详细信息 here。例如,您可以
tapply(problem_data$var, problem_data[, -1L], mean)
这为您提供了类似于 xtabs(~dates + types + types2 + names, data = problem_data)
的内容,只是单元格中的所有值现在都是组均值。你可以这样做
smy <- tapply(problem_data$var, problem_data[, -1L], mean)
x <- ftable(smy, row.vars = c(4L, 1L), col.vars = 2:3) # var 1 is the first var you see in names(problem_data[, -1L])
y <- ftable(smy, row.vars = 1L, col.vars = c(4L, 2:3))
并且memisc::show_html(x)
给出
memisc::show_html(y)
给出