如何在 for 循环中绑定表
How to bind tables in a for loop
我正在尝试创建一个 table 来汇总数据集中的数据。我有:
set.seed(123)
age <- runif(100, 1, 100)
gender <- sample(c("Male", "Female"), 100, replace=TRUE)
bmi <- rep(c("Normal"), 100)
height <- runif(100, 150, 190)
smoker <- sample(c("Yes", "No"), 100, replace=TRUE)
finaldata <- data.frame(age, gender, bmi, height, smoker)
str(finaldata)
continuous <- finaldata[ ,c(1, 4)]
categorical <- finaldata[ ,c(2, 3, 5)]
Table1 <- function(CONT, CAT, DIGITS=2){
table_cont <- matrix(0, ncol=2, nrow=ncol(CONT))
for (i in 1:ncol(CONT)){
table_cont[i, ] <- c(round(mean(CONT[ ,i]), DIGITS), round(sd(CONT[ ,i]), DIGITS))
}
cats <- function(VARIABLE){
table_cat <- matrix(0, ncol=2, nrow=dim(table(CAT[ ,VARIABLE])))
for (i in 1:dim(table(CAT[ ,VARIABLE]))){
table_cat[i, ] <- c(table(CAT[ ,VARIABLE])[i], paste(round(prop.table(table(CAT[ ,VARIABLE]))[i]*100, DIGITS), "%"))
}
rownames(table_cat) <- levels(CAT[, VARIABLE])
table_cat <- rbind(rep("", ncol=ncol(table_cat)), table_cat)
return(table_cat)
}
table_cat <- rbind(cats(1), cats(2), cats(3))
descriptives <- rbind(table_cont, table_cat)
return(descriptives)
}
Table1(continuous, categorical)
它工作正常。也就是说,为了绑定分类变量,我正在执行 rbind(cats(1), cats(2), cats(3))。虽然这对这个数据集来说没问题,但我不想为我使用的每个其他数据集不断改变它。我尝试将它们绑定在一个 for 循环中,但没有成功。如何在不重复指定 rbind(cats(1), cats(2), cats(3)) 的情况下绑定它们?
试试这个:
table_cat <- data.frame()
# N here is the number of cat() function calls you plan on making
for(i in 1:N){
table_cat <- rbind(table_cat,cat(i))
}
如果您不希望出现行名问题,请尝试以下操作:
table_cat <- matrix(nrow=0,ncol=ncol(cats(1)))
for(i in 1:3){
table_cat <- rbind(table_cat,cats(i))
}
除非您的行相互依赖,否则您应该使用 apply
或 plyr
的 ddply
等函数来处理数据,而无需所有 for 循环。
cont.func <- function(CONT.col, DIGITS=2){
c(round(mean(CONT.col), DIGITS), round(sd(CONT.col), DIGITS))
}
CONT = t(apply(continuous,2,cont.func))
cat.func <- function(CAT.col,DIGITS=2){
tab = table(CAT.col)
rbind(cbind(tab, paste0(round(prop.table(tab)*100, DIGITS), "%")),"")
}
CAT = do.call("rbind",apply(categorical,2,cat.func))
rbind(CONT,c("",""),CAT)
此外,您可以在 cat.func
中的 rbind
调用周围使用 as.data.frame
以在创建 CAT 时保留分类变量名称。根据您的需要,这可能比使用空白引号更可取。
您想这样做:
library(dplyr)
library(tidyr)
better_summary = function(data){
continuous = data %>% Filter(is.numeric, .)
categorical = data %>% Filter(. %>% is.numeric %>% `!`, .)
continuous_summary =
continuous %>%
gather(variable, value) %>%
group_by(variable) %>%
summarize(mean = mean(value),
sd = sd(value))
categorical_summary =
categorical %>%
gather(variable, value) %>%
count(variable, value) %>%
mutate(percent = n / sum(n))
list(continuous_summary = continuous_summary,
categorical_summary = categorical_summary)
}
我正在尝试创建一个 table 来汇总数据集中的数据。我有:
set.seed(123)
age <- runif(100, 1, 100)
gender <- sample(c("Male", "Female"), 100, replace=TRUE)
bmi <- rep(c("Normal"), 100)
height <- runif(100, 150, 190)
smoker <- sample(c("Yes", "No"), 100, replace=TRUE)
finaldata <- data.frame(age, gender, bmi, height, smoker)
str(finaldata)
continuous <- finaldata[ ,c(1, 4)]
categorical <- finaldata[ ,c(2, 3, 5)]
Table1 <- function(CONT, CAT, DIGITS=2){
table_cont <- matrix(0, ncol=2, nrow=ncol(CONT))
for (i in 1:ncol(CONT)){
table_cont[i, ] <- c(round(mean(CONT[ ,i]), DIGITS), round(sd(CONT[ ,i]), DIGITS))
}
cats <- function(VARIABLE){
table_cat <- matrix(0, ncol=2, nrow=dim(table(CAT[ ,VARIABLE])))
for (i in 1:dim(table(CAT[ ,VARIABLE]))){
table_cat[i, ] <- c(table(CAT[ ,VARIABLE])[i], paste(round(prop.table(table(CAT[ ,VARIABLE]))[i]*100, DIGITS), "%"))
}
rownames(table_cat) <- levels(CAT[, VARIABLE])
table_cat <- rbind(rep("", ncol=ncol(table_cat)), table_cat)
return(table_cat)
}
table_cat <- rbind(cats(1), cats(2), cats(3))
descriptives <- rbind(table_cont, table_cat)
return(descriptives)
}
Table1(continuous, categorical)
它工作正常。也就是说,为了绑定分类变量,我正在执行 rbind(cats(1), cats(2), cats(3))。虽然这对这个数据集来说没问题,但我不想为我使用的每个其他数据集不断改变它。我尝试将它们绑定在一个 for 循环中,但没有成功。如何在不重复指定 rbind(cats(1), cats(2), cats(3)) 的情况下绑定它们?
试试这个:
table_cat <- data.frame()
# N here is the number of cat() function calls you plan on making
for(i in 1:N){
table_cat <- rbind(table_cat,cat(i))
}
如果您不希望出现行名问题,请尝试以下操作:
table_cat <- matrix(nrow=0,ncol=ncol(cats(1)))
for(i in 1:3){
table_cat <- rbind(table_cat,cats(i))
}
除非您的行相互依赖,否则您应该使用 apply
或 plyr
的 ddply
等函数来处理数据,而无需所有 for 循环。
cont.func <- function(CONT.col, DIGITS=2){
c(round(mean(CONT.col), DIGITS), round(sd(CONT.col), DIGITS))
}
CONT = t(apply(continuous,2,cont.func))
cat.func <- function(CAT.col,DIGITS=2){
tab = table(CAT.col)
rbind(cbind(tab, paste0(round(prop.table(tab)*100, DIGITS), "%")),"")
}
CAT = do.call("rbind",apply(categorical,2,cat.func))
rbind(CONT,c("",""),CAT)
此外,您可以在 cat.func
中的 rbind
调用周围使用 as.data.frame
以在创建 CAT 时保留分类变量名称。根据您的需要,这可能比使用空白引号更可取。
您想这样做:
library(dplyr)
library(tidyr)
better_summary = function(data){
continuous = data %>% Filter(is.numeric, .)
categorical = data %>% Filter(. %>% is.numeric %>% `!`, .)
continuous_summary =
continuous %>%
gather(variable, value) %>%
group_by(variable) %>%
summarize(mean = mean(value),
sd = sd(value))
categorical_summary =
categorical %>%
gather(variable, value) %>%
count(variable, value) %>%
mutate(percent = n / sum(n))
list(continuous_summary = continuous_summary,
categorical_summary = categorical_summary)
}