以下函数创建一个表,其中变量名称为维名称
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
)显示不带引号的变量名称(仅vara
和varb
而不是"vara"
和{{1} } 在这种情况下)。有谁知道如何做到这一点?我想删除函数中的引号而不是它之外的引号。
答案 0 :(得分:5)
你做了一些你不想要的事情,导致了这种行为。
v1
和v2
不是函数参数(即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