2011-09-27 89 views
2

我有一個數據框,我試圖在其上運行一個子集。在我的數據幀,我有一個名爲列「開始」,我試圖做到這一點:使用與列名稱相同的變量對數據框進行子集

sub <- subset(data,data$start==14) 

,我得到正確的地方開始= 14的所有行的一個子集。

但是,當我這樣做:

for(start in seq(1,20,by=1)) { 
    sub <- subset(data,data$start==start) 
    print(sub) 
} 

它不能正確找到的子集。它只是打印整個數據框。

這是爲什麼?如何解決?

回答

1

你也可以指定你工作的環境:

x<-data.frame(
    start=sample(3,20,replace=TRUE), 
    someValue=runif(20)) 

env<-environment() 
start<-3 
cat("\nDefaut scope:") 
print(subset(x,start==start)) # all entries, as start==start is evaluated to TRUE 

cat("\nSpecific environment:") 
print(subset(x,start==get('start',env))) # second start is replaced by its value in former environment. Equivalent to subset(x,start==3) 
1

修復起來很簡單。只需將您的for循環計數器或您的數據框列重命名爲start以外的內容即可。

它發生的原因是因爲subset正試圖評估數據框data內部的表達式data$start == start。因此,它看到列start並在那裏停止,從未看到您在for循環中定義的其他變量start

也許更好地瞭解R爲什麼會在這裏混淆是要注意,使用subset時,通常不需要使用data$來引用變量。所以,想象一下,告訴R:

subset(data,start == start) 

R的只是要「內data S和得到所有TRUE的矢量」評估這兩個start的背部。

0

另一種方法是使用支架子集,而不是subset功能。

for(start in seq(1,20,by=1)) { 
    sub <- data[data$start==start,] 
    print(sub) 
} 

subset採用了非標準的評價規則,這是導致你所看到的範圍界定問題(到start你指的是?)。如果有(或可能)NA的在data$start,你可能需要

sub <- data[!is.na(data$start) & data$start==start,] 

注意從subset幫助頁面這樣的警告:

這是旨在用於交互的便捷功能。對於編程,最好使用標準的子集函數,特別是參數子集的非標準評估可能會有意想不到的後果。

相關問題