R 使用多个不同大小的表合并和重塑数据/表
我的目标是得到一个表,对于分类变量列表,它返回(从最左边的列到最右边的列):分类变量名称,分类变量级别,二进制分组变量第一级的频率,二进制分组变量第二级的频率,卡方检验统计量,p.值和测试方法。我想要的输出示例显示在页面的最底部。当前输出和代码用于单个类别变量。我尽量不把马放在马车前面。现在,为单个变量获取正确的格式将是很好的。我会让它做一个字符串,然后再把它们放在一起 代码给出了迄今为止我能理解的内容。我相当肯定有一种更简单的方法可以做到这一点。有人告诉我tables::tabular,但我可以让它完全满足我的要求。我目前还不知道如何重塑(以及如何在最后三列中消除重复项,但我还不知道) 任何使用当前代码或其他方法的帮助都将非常感谢R 使用多个不同大小的表合并和重塑数据/表,r,merge,reshape,tabular,R,Merge,Reshape,Tabular,我的目标是得到一个表,对于分类变量列表,它返回(从最左边的列到最右边的列):分类变量名称,分类变量级别,二进制分组变量第一级的频率,二进制分组变量第二级的频率,卡方检验统计量,p.值和测试方法。我想要的输出示例显示在页面的最底部。当前输出和代码用于单个类别变量。我尽量不把马放在马车前面。现在,为单个变量获取正确的格式将是很好的。我会让它做一个字符串,然后再把它们放在一起 代码给出了迄今为止我能理解的内容。我相当肯定有一种更简单的方法可以做到这一点。有人告诉我tables::tabular,但我可
#make data (I couldn't get return() to work, so I used <<)
get.data<-function(){
set.seed(1)
cat1 <-sample(c(1,2), 100, replace=T)
cont1<-rnorm(100, 25, 8)
cont2<-rnorm(100, 0, 1)
cont3<-rnorm(100, 6, 14.23)
cont4<-rnorm(100, 25, 8)*runif(5, 0.1, 1)
cat2<-sample(c(1,2,3,4),100,replace=TRUE)
cat3<-sample(c(1,2,3,4,5),100,replace=TRUE)
cat4<-sample(c("Caucasian","African American", "Latino", "Multi-Racial", "No
Response"),100,replace=TRUE)
group<-sample(c(0,1), 100, replace=T)
sex<-sample(c("male", "female"), 100, replace=T)
one <<-data.frame(group, sex,cat1, cont1, cont2, cont3, cont4,cat2,cat3,cat4)
}
get.data()
#getting the two bits of data I would like
attach(one)
long <- (with(one, table(cat2,group)))
test<-with(one, chisq.test(cat2,group))
kk<-c(test$statistic,test$p.value,test$method)
detach(one)
#merging them together
res<-merge(as.data.frame(as.matrix(long)), as.data.frame(as.matrix(kk)),
all=TRUE, sort=FALSE)
#unsuccessfully reshaping the data
wider <- reshape(as.data.frame(res), idvar = cat2,
timevar = "V1", direction = "wide")
以下是我希望输出的样子:
Variable Response Group1.Freq Group2.Freq Test.Stat p.value method
Cat2 1 17 12 1.16 0.761 Pearson's Chi...
2 11 13
3 13 9
4 13 12
新发行:
我使用Ram的建议创建了一个函数,这样我就可以为多个分类变量创建一个data.frame。我想出了这个密码。但在rbind和lapply步骤中输出混乱。我想知道如何着手解决这个问题。同样,产出处于底部
get.data<-function(){
set.seed(1)
cat1 <-sample(c(1,2), 100, replace=T)
cont1<-rnorm(100, 25, 8)
cont2<-rnorm(100, 0, 1)
cont3<-rnorm(100, 6, 14.23)
cont4<-rnorm(100, 25, 8)*runif(5, 0.1, 1)
cat2<-sample(c(1,2,3,4),100,replace=TRUE)
cat3<-sample(c(1,2,3,4,5),100,replace=TRUE)
cat4<-sample(c("Caucasian","African American", "Latino", "Multi-Racial", "No
Response"),100,replace=TRUE)
group<-sample(c(0,1), 100, replace=T)
sex<-sample(c("male", "female"), 100, replace=T)
one <<-data.frame(group, sex,cat1, cont1, cont2, cont3, cont4,cat2,cat3,cat4)
}
get.data()
make.table<-function(catvars,group,data){
attach(data)
get.chi.stuff<-function(cat, group){
long <- table(cat,group)
test<-chisq.test(cat,group)
kk<-c(test$statistic,test$p.value,test$method)
res <- data.frame(matrix(NA,nrow(long),7))
names(res) <- c("Variable", "Response", "Group1.Freq", "Group2.Freq",
"Test.Stat", "p.value", "method")
res[1,1] <- deparse(substitute(cat))
res[,2] <- row.names(long)
res[,3:4] <- long[,1:2]
res[1,5:7] <- kk
return(res)
}
tables<<-do.call(rbind,lapply(data[,catvars],get.chi.stuff,group=group))
detach(data)
}
make.table(catvars=catvars,group=group, data=one)
由于您使用的是
merge
,因此它会创建一个循环使用的数据帧,这不是您想要的res
您已经在变量、long
、kk
和测试中创建了所需的所有组件。因此,现在的问题是将所有内容以您想要的特定格式缝合在一起
这并不是很优雅,因为我们正在一列一列地手工构建所需的结果。你可以把所有这些都放到一个函数中
res <- data.frame(matrix(NA,nrow(long),7))
names(res) <- c("Variable", "Response", "Group1.Freq", "Group2.Freq",
"Test.Stat", "p.value", "method")
res[1,1] <- names(attr(test$observed, "dimnames")[1])
res[,2] <- row.names(long)
res[,3:4] <- long[,1:2]
res[1,5:7] <- kk
res
# Variable Response Group1.Freq Group2.Freq Test.Stat
# 1 cat2 1 17 12 1.16345446805217
# 2 <NA> 2 11 13 <NA>
# 3 <NA> 3 13 9 <NA>
# 4 <NA> 4 13 12 <NA>
# p.value method
# 1 0.761782111152171 Pearson's Chi-squared test
# 2 <NA> <NA>
# 3 <NA> <NA>
# 4 <NA> <NA>
res这很有效。我确实不得不更改:res[1,1]对于您的rbind
和lappy
问题,我建议将其作为一个新问题。这个问题已经变得越来越大了。如果你发布一个MRE(最小可复制示例),这里有很多人会帮助你。
row.names Variable Response Group1.Freq Group2.Freq Test.Stat p.value method
cat2.1 X[[1L]] 1 17 12 1.16345446805217 0.761782111152171 Pearson's Chi-squared test
cat2.2 NA 2 11 13 NA NA NA
cat2.3 NA 3 13 9 NA NA NA
cat2.4 NA 4 13 12 NA NA NA
cat3.1 X[[2L]] 1 8 15 5.68288366946583 0.224115426983988 Pearson's Chi-squared test
6 cat3.2 NA 2 10 7 NA NA NA
7 cat3.3 NA 3 14 11 NA NA NA
8 cat3.4 NA 4 8 7 NA NA NA
9 cat3.5 NA 5 14 6 NA NA NA
10 cat4.1 X[[3L]] African American 9 18 8.73180996607079 0.0681639164530817 Pearson's Chi-squared test
11 cat4.2 NA Caucasian 14 5 NA NA NA
12 cat4.3 NA Latino 6 7 NA NA NA
13 cat4.4 NA Multi-Racial 14 9 NA NA NA
14 cat4.5 NA No
Response 11 7 NA NA NA
15 sex.1 X[[4L]] female 30 17 2.74327353028067 0.0976645121155453 Pearson's Chi-squared test with Yates' continuity correction
16 sex.2 NA male 24 29 NA NA NA
res <- data.frame(matrix(NA,nrow(long),7))
names(res) <- c("Variable", "Response", "Group1.Freq", "Group2.Freq",
"Test.Stat", "p.value", "method")
res[1,1] <- names(attr(test$observed, "dimnames")[1])
res[,2] <- row.names(long)
res[,3:4] <- long[,1:2]
res[1,5:7] <- kk
res
# Variable Response Group1.Freq Group2.Freq Test.Stat
# 1 cat2 1 17 12 1.16345446805217
# 2 <NA> 2 11 13 <NA>
# 3 <NA> 3 13 9 <NA>
# 4 <NA> 4 13 12 <NA>
# p.value method
# 1 0.761782111152171 Pearson's Chi-squared test
# 2 <NA> <NA>
# 3 <NA> <NA>
# 4 <NA> <NA>