4

次の関数は、変数名を次元名として持つテーブルを作成します

col.table <- function(var1, var2, C=T,weights=rep(1,length(var1)), margins=TRUE,data,env=parent.frame()){ 
  require(weights); require(Hmisc)
  v1 <- deparse(substitute(var1)) 
  v2 <- deparse(substitute(var2)) 
  if(!missing(data)){
    var1 <- data[,deparse(substitute(var1))]
    var2 <- data[,deparse(substitute(var2))]
    weights <- data[,deparse(substitute(weights))]
  }


  if (C) {
    crosstab <-prop.table(xtabs(weights ~ var1 + var2,data), margin=2)

    t <- cbind(crosstab, Total=prop.table(xtabs(weights ~ var1,data=data)))
    t <- rbind(t,Total = colSums(t))
    bu<-c(deparse(substitute(v1)), deparse(substitute(v2)))

    names(dimnames(t)) <- bu
    return(round(100*t,2))

}}

いくつかのダミーデータ

d<-data.frame(
  vara =c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3),
  varb = c(1,1,2,2,3,3,1,1,2,2,3,3,1,1,2),
  varc= c(1,2,3,1,2,3,1,2,3,1,2,3,1,2,3),
  weight= c(.5,.5,.5,.5,.5,1,1,1,1,1,2,2,2,2,2))

a<-col.table(vara,varb,data=d,weights=weight)
a

a返されたオブジェクト ( ) で、引用符なしで変数名を表示したいと思います (この場合はvaraandvarbの代わりに"vara"andのみ"varb")。誰もこれを行う方法を知っていますか? 関数の外側ではなく、関数内の引用符を削除したい。

4

4 に答える 4

5

意図しないことを行ったために、この動作が発生しました。

v1andv2は関数の引数 (つまり、promise) ではありません。それらはcharacter、関数のローカル環境における変数です。それらを に渡してsubstituteも (プロミスではないため) 何もしませんが、 に渡すとdeparse、値の両側に引用符が追加されます。これはあなたのコードの問題です。

初め:

v1 <- deparse(substitute(var1)) 
v2 <- deparse(substitute(var2)) 

それで:

bu<-c(deparse(substitute(v1)), deparse(substitute(v2)))

この後者の行を次のように変更します。

bu <- c(v1, v2)

これにより、後で引用符を削除して問題を隠すのではなく、問題の根本を解決できます。

次の式に追加された引用符に注意してください。これはあなたの機能で間違っていることです:

> deparse('abc')
[1] "\"abc\""
于 2012-12-28T02:16:22.547 に答える
2

引用符を削除するために使用gsub('"','',...): 関連するコード行を

names(dimnames(t)) <- gsub('"','',bu)

やるべきだと思います。

于 2012-12-27T22:16:30.587 に答える
1

あなたはこれを行うことができます:

 names(dimnames(a)) <- c("vara","varb")
于 2012-12-27T21:57:51.267 に答える