R删除数据框列名中的引号

时间:2014-09-21 19:36:26

标签: r data-migration spss

我有SPSS数据,我必须迁移到R.数据很大,有202列和数千行

v1 v2    v3     v4 v5
1  USA   Male   21 Married
2  INDIA Female 54 Single
3  CHILE Male   33 Divorced ...and so on...

数据文件  包含变量标签"Identification No", "Country of origin", "Gender", "(Current) Year", "Marital Status - Candidate"

我使用以下命令从SPSS读取数据

data<-read.spss(file.sav,to.data.frame=TRUE,reencode='utf-8')

列名称读作v1,v2,v3,v4等,但我希望变量标签作为数据框中的列名。我使用以下命令查找变量标签并将其设置为名称

vname<-attr(data,"variable.labels")
for(i in 1:202){vl[i]<-vname[[i]]}
names(data)<-vl

现在问题是我必须像data$"Identification number"那样处理那个列,这不是很好。我想删除列名称周围的引号。我怎么能这样做?

3 个答案:

答案 0 :(得分:4)

你不能。不带引号的空格是一种破坏语法的句法符号。

一个选项是将名称更改为不带空格的名称,您可以使用make.names函数来执行此操作。

> N = c("foo","bar baz","bar baz")
> make.names(N)
[1] "foo"     "bar.baz" "bar.baz"

您可能需要确保拥有唯一的名称:

> make.names(N, unique=TRUE)
[1] "foo"       "bar.baz"   "bar.baz.1"

答案 1 :(得分:2)

引号是因为名称中有空格。 print(vl,quotes=FALSE)显示的文字没有引号。但我必须使用引号才能将其用作单个变量名称。如果没有引号,空格会破坏变量名称。

这可以通过删除名称中的空格来解决。我通过使用gsub命令

替换名称之间的所有空格来解决这个问题
vl<-gsub(" ","",vl)
names(data)<-vl

现在可以在不使用引号的情况下访问大多数列名。但是,如果没有引用,则不能使用包含其他标点符号的名称。

Alos Spacedman的解决方案运行良好,似乎更容易使用。

make.names(vl, unique=TRUE)

但我喜欢David Arenburg的解决方案。

gsub("[ [:punct:]]", "" , vl)

删除了所有标点符号,使列名更干净,更好。

答案 2 :(得分:1)

data.table列名称中的空格没有问题。但是,不,没有办法避免使用引号,因为Spacedman给出了:空格打破了语法。

require(data.table)
DT <- data.table(a = c(1,1), "bc D" = c(2,3))

# three identical results:
DT[['bc D']]
DT$bc
DT[,`bc D`]

好的,所以与$(也适用于data.frames)的部分匹配让你不再使用引号。但如果你弄错了会带来麻烦。