2014-09-21 82 views
0

我有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"該列,這是不是很漂亮。我想刪除列名稱周圍的引號。我怎樣才能做到這一點?

+2

我懷疑你的列名真的有引號。 R代表字符值IMO。你的colnames的問題是它們包含空格和'(' – 2014-09-21 19:49:19

+1

實際上更多的情況是,所有對「$」的調用確實在第二個參數周圍隱含了引號,但是它們的打印被抑制。「$」函數的語法糖模糊了真正發生的事情,「$」實際上是「[[」,對後面的表達式進行了非標準的評估,每個人都應該花一點時間閱讀''的細節''中的相關部分[[''' – 2014-09-21 22:01:14

回答

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

在他它會導致名稱有很多點和附加字母(如'''而不是'('等),也許更清潔的選項是'gsub(「[[:punct:]]」,「 「,N)''? – 2014-09-21 19:53:51

+0

是的,它給了單詞之間的多個點,它可以工作,但它不是一個很好的解決方案 – Prabhu 2014-09-21 21:25:18

+0

應該有一個make_names和一個makeCamel – 2014-09-21 21:57:19

1

引號在那裏,因爲名字有空格的。 print(vl,quotes=FALSE)顯示的文字不帶引號。但我必須使用引號才能將其用作單個變量名稱。如果沒有引號,空格會打破變量名稱。

這可以通過刪除名稱中的空格來解決。我用gsub命令

vl<-gsub(" ","",vl) 
names(data)<-vl 

現在大部分的列名可以不使用引號來訪問解決了這個代的名稱之間的所有空間。但包含其他標點符號的名稱不能在沒有引號的情況下使用。

由Spacedman的解決方案工作得很好,似乎更容易使用。

make.names(vl, unique=TRUE) 

但我喜歡David Arenburg的解決方案。

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

它刪除了所有的標點符號,並使列名更乾淨更好。

+1

實際上你的'gsub('「,」,vl)'解決方案將不允許你訪問沒有引號的'(Current)Year'這樣的列 – 2014-09-21 20:14:45

+0

這就是爲什麼我喜歡你的方法 – Prabhu 2014-09-24 06:37:43

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)讓你出使用引號。但是如果你弄錯了,它會帶來麻煩。

+0

'DT $「bc D」 '和'DT $ bc'給出相同的結果。它是真實的。直到你指出,我才知道。但在我的情況下,我不想使用引號,使用不帶引號的'$'並不指向唯一列。 – Prabhu 2014-09-21 21:21:25