2016-10-10 88 views
0

對不起,有一種新問題,因爲我多年來一直在使用R,但直到有學生指出我和我無法解釋它。首先,建立一個小數據框。假設x值大於100應該是非法的,但有些人已經偷偷溜進了這裏。我們也有一個「羣」自變量:R奇怪的數據框子集公式與沒有公式

x = c(20, 30, 50, 60, 150, 35, 55, 75, 45, 145) 
g = c(1,1,1,1,1,2,2,2,2,2) 
df = data.frame(cbind(x,g)) 

現在,箱線圖,既分組和不分組,顯示所有的數據,包括非法值,因爲他們應該:

boxplot(x~g) 
boxplot(x) 

所以,我們希望通過在框架與x值只選擇那些行不到100組合版本刪除非法值工程完全按照預期:

boxplot(x~g, data=df[x < 100,]) 

但取消組合的一個沒有!所有數據,包括超過100的數值都被繪製出來。爲什麼前一個工作,這一個沒有?

boxplot(x, data=df[x < 100,]) 

我敢肯定,我失去了一些東西簡單,但對我的生活我無法弄清楚它是什麼,我無法找到通過谷歌或在這裏尋找答案。

回答

0

原因是因爲boxplot從全球環境中讀取x,而不是數據幀。

請注意,這並不工作,以及:

df1 = df[x < 100, ] 
boxplot(x, data=df1) 

然而,這個工程:

boxplot(df[df$x < 100, 'x']) 
+1

不完全;看到我上面的評論。 – joran

2

boxplot是S3通用的,這意味着根據第一個參數是什麼,完全實際上正在調用不同的功能。 boxplot.formulaboxplot.default有不同的論點。具體而言,boxplot.default根本沒有數據參數;它可能被吸入...,然後被忽略爲未知的圖形參數。

嘗試用boxplot(x[x < 100])代替。

+0

當然!是的,我明白了。很難向初學者解釋,他們仍然只是首先考慮功能的想法,但至少現在我知道了。 (順便說一句,你的方法正是我給學生的解決方案,但我不確定它爲什麼這樣工作。) –