2014-11-20 53 views
2

我必須缺少一些非常基本的東西。希望有人能指出。我試圖子集基於特定年份和性別以下數據幀...由於無法解釋的原因,R子集函數返回零記錄

str(Bnames) 
'data.frame': 258000 obs. of 4 variables: 
$ X.year. : int 1880 1880 1880 1880 1880 1880 1880 1880 1880 1880 ... 
$ X.name. : Factor w/ 6782 levels "\"Aaden\"","\"Aaliyah\"",..: 3380 6632 3125 1174 2554 2449 3428 6232 2834 5517 ... 
$ X.percent.: num 0.0815 0.0805 0.0501 0.0452 0.0433 ... 
$ X.sex. : Factor w/ 2 levels "\"boy\"","\"girl\"": 1 1 1 1 1 1 1 1 1 1 ... 

我輸入的代碼是

one <- subset(Bnames, X.year.==2008 & X.sex.=="boy") # I get zero rows returned 

two<- subset(Bnames, X.year.==2008) # I get 2000 rows returned, which is correct 

three <- subset(Bnames, X.sex.=="boy") # I get 0 rows returned 

four <- subset(Bnames, X.name.=="John") # I get 0 rows returned 

我不明白。我正在使用一個可免費使用的數據集http://plyr.had.co.nz/09-user/

如果我通過重複採樣c("boy","girl")來製作自己的數據幀,則該子集可以正常工作。爲什麼代碼與我開始使用的數據失敗?

+6

看來你的因子列的級別被引用了:例如'X.sex.'列沒有'boy'或'girl'級別,而是''boy''和''girl'' 。試試:'一個< - 子集(Bnames,X.year。== 2008&X.sex。==「\」boy \「」)' – nicola 2014-11-20 21:04:10

+1

@nicola:您應該將其作爲答案發布。 – 2014-11-21 02:08:27

+0

@BondedDust發表回覆。謝謝。 – nicola 2014-11-21 06:23:58

回答

2

您得到0結果的原因是您的factor列的級別被引用。例如,X.sex.列級別不是boygirl,而是"boy""girl"。這可能是由於您導入data.frame的文件有引用的字段,而且它是通過read.table(或其他等效函數)與quote=FALSE參數進行讀取的。如果是這樣,您可以輕鬆地重新讀取文件並糾正這個相當煩人的功能。

無論如何,要正確的子集,您的data.frame請記住引號。例如:

one <- subset(Bnames, X.year.==2008 & X.sex.=="\"boy\"") 

或者,你可以使用'的報價:

one <- subset(Bnames, X.year.==2008 & X.sex.=='"boy"') 

如果你想擺脫惱人的報價,而無需重建data.frame,只是嘗試:

Bnames[,4]<-factor(gsub(Bnames[,4],'"',"")) 
+0

這個工作,但我必須移動Bnames,如下所示... Bnames [,4] < - factor(gsub (''',「」,Bnames [,4]))。謝謝 – giderk 2014-11-21 22:23:56