我有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"
那样处理那个列,这不是很好。我想删除列名称周围的引号。我怎么能这样做?
答案 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)的部分匹配让你不再使用引号。但如果你弄错了会带来麻烦。