取消引用维度名称

时间:2012-12-27 21:52:43

标签: r

以下函数创建一个表,其中变量名称为维名称

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)显示不带引号的变量名称(仅varavarb而不是"vara"和{{1} } 在这种情况下)。有谁知道如何做到这一点?我想删除函数中的引号而不是它之外的引号。

4 个答案:

答案 0 :(得分:5)

你做了一些你不想要的事情,导致了这种行为。

v1v2不是函数参数(即promises)。它们是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\""

答案 1 :(得分:2)

使用gsub('"','',...)删除引号:将相关的代码行更改为

names(dimnames(t)) <- gsub('"','',bu)
我认为应该这样做。

答案 2 :(得分:1)

你可以这样做:

 names(dimnames(a)) <- c("vara","varb")

答案 3 :(得分:1)

尝试as.name()取消引号,无论是单引号还是双引号。如果字符串有一个嵌入的空格,as.name()将它包含在反引号(string)中,并且很难将它用作变量名,但也许有办法。

演示:

> as.name("v7")
v7
> as.name('v7')

> as.name("v7 xx")
`v7 xx`
> as.name('v7 xx')
`v7 xx`
> as.name(`v7`)
Error in as.name(v7) : object 'v7' not found
> `v7` <= data.frame()
Error: object 'v7' not found
> 'v7' <= data.frame
Error in "v7" <= data.frame : 
  comparison (4) is possible only for atomic and list types
> "v7" <= data.frame
Error in "v7" <= data.frame : 
  comparison (4) is possible only for atomic and list types
相关问题