2013-05-21 82 views
1

這個片斷:過濾中的R數據幀和一個不希望過濾掉結果

names<-c("Alice","Bob","Charlie") 
ages<-c(25,24,25) 
friends<-data.frame(names,ages) 
a25 <- friends[friends$age==25,] 
a25 
table(a25$names) 

給我這個輸出

names ages 
1 Alice 25 
3 Charlie 25 

    Alice  Bob Charlie 
     1  0  1 

現在,爲什麼「鮑勃」是因爲數據幀輸出a25不包含「Bob」?我希望像這樣的輸出(從table命令):

Alice Charlie 
     1  1 

我缺少什麼?

我的環境:

R version 2.15.2 (2012-10-26) 
Platform: i386-w64-mingw32/i386 (32-bit) 
+2

你'names'變量已轉換爲一個因素。 「表格」顯示您的因子的每個等級的計數,即使他們有0個計數。 – juba

+0

@juba謝謝,所以當我創建'a25'變量時,它是否「繼承」三個層次的因子? –

+1

'a25'不是一個變量,它是一個數據框,它是'friends'的一個子集。所以它繼承了所有級別的「朋友」的「年齡」因素,是的。 – juba

回答

1

這個問題似乎在評論一個答案。這個答案分享了另外一種方法,並整理了評論中的建議。

您描述的問題如下所示:「a25 $ names」變量中沒有「Bob」,但當您使用table時,「Bob」出現。這是因爲原始列中的級別已被保留。

table(a25$names) 
# 
# Alice  Bob Charlie 
#  1  0  1 

幸運的是,有一個名爲droplevels函數,需要照顧的情況是這樣的:

table(droplevels(a25$names)) 
# 
# Alice Charlie 
#  1  1 

droplevels功能可以在data.frame工作太,讓您做到以下幾點:

a25alt <- droplevels(friends[friends$ages==25,]) 
a25alt 
#  names ages 
# 1 Alice 25 
# 3 Charlie 25 
table(a25alt$names) 
# 
# Alice Charlie 
#  1  1 

正如在評論中提到的,al所以看as.characterfactor

table(as.character(a25$names)) 
table(factor(a25$names))