R - xtabs()vs table():丢弃级别并定义变量名称?

时间:2012-01-15 15:21:27

标签: r crosstab

我有一个大型数据框,想要列出所有变量 - paris。 table()和xtabs()都这样做,但问题是:

  1. xtabs()允许我删除未使用的变量级别,这是我需要的,但不允许 我定义了维度的名称
  2. table()允许我定义维度名称,但不允许删除未使用的级别。
  3. 我需要定义维度名称的原因是所有这些都发生在for循环中(因为我需要做每个人的所有人')这会使名称变得毫无意义。以下是一个简单的'举例说明我的意思。

    var.3=factor(rep(c("m","f","t"), c(5,5,2)))
    df <- data.frame(var.1=rep(1:4, 1:4), var.2=rep(c("A","B"), 5), var3=var.3[1:10])
    levels(df[,3])           # the "t" level is not in the df!
    tabs.list<- list()
    xtabs.list<- list()
    for (i in 1:(ncol(df)-1)){
      for (j in (i+1):ncol(df)) {
        tabs.list[[paste(sep=" ", colnames(df)[i], "by",colnames(df)[j])]] <-
          table(df[,i],df[,j], dnn=list(colnames(df)[i], colnames(df)[j]))
        xtabs.list[[paste(sep=" ", colnames(df)[i], "by",colnames(df)[j])]] <-
          xtabs(~df[,i]+df[,j], drop.unused.levels=TRUE)
      }
    }
    tabs.list
    xtabs.list
    #What I want: 
    for (i in 1:length(xtabs.list)){
    names(dimnames(xtabs.list[[i]])) <- names(dimnames(tabs.list[[i]]))
    }
    xtabs.list
    

    因此,两个用于交叉分类数据的函数都有一个我想要使用的选项!?为什么我不能同时做这两件事?

1 个答案:

答案 0 :(得分:2)

通过包装as.character

来“去分解”参数非常容易
tabs.list<- list()
for (i in 1:(ncol(df)-1)){
    for (j in (i+1):ncol(df)) {
      tabs.list[[paste(sep=" ", colnames(df)[i], "by",colnames(df)[j])]] <-
        table( as.character(df[,i]), 
               as.character(df[,j]), 
               dnn=list(colnames(df)[i], colnames(df)[j])) 
                              }
                           }
tabs.list