2012-01-15 103 views
2

我有一個大的數據框,並希望製表所有變量巴黎。表()和XTABS()都做到這一點,但問題是:R - xtabs()vs table():刪除級別AND定義變量名稱?

  1. XTABS()讓我刪除未使用的變量的水平,這是我需要的,但不能讓 我定義尺寸的名字
  2. table()允許我定義維度名稱,但不能刪除未使用的級別。

我需要定義維度名稱的原因是,所有這些都發生在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 

因此,用於交叉分類數據的兩個函數每個都有一個我想要使用的選項!?爲什麼我不能同時做?

回答

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 
+0

哦當然包裝很容易「去比化」的論點。降級是關於因素的..謝謝你的Dwin! – maja 2012-01-24 13:39:29