R 使用多个不同大小的表合并和重塑数据/表

R 使用多个不同大小的表合并和重塑数据/表,r,merge,reshape,tabular,R,Merge,Reshape,Tabular,我的目标是得到一个表,对于分类变量列表,它返回(从最左边的列到最右边的列):分类变量名称,分类变量级别,二进制分组变量第一级的频率,二进制分组变量第二级的频率,卡方检验统计量,p.值和测试方法。我想要的输出示例显示在页面的最底部。当前输出和代码用于单个类别变量。我尽量不把马放在马车前面。现在,为单个变量获取正确的格式将是很好的。我会让它做一个字符串,然后再把它们放在一起 代码给出了迄今为止我能理解的内容。我相当肯定有一种更简单的方法可以做到这一点。有人告诉我tables::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>