2016-07-30 96 views
1

這裏是我的代碼和繪圖結果,由於某些異常值,x軸很長。有沒有一個簡單的方法,我可以篩選df$foo R只有0-90%或0-95%的百分點,這樣我可以只繪製正常值?謝謝。只顯示0-90%或0-95%百分位數

df <- read.csv('~/Downloads/foo.tsv', sep='\t', header=F, stringsAsFactors=FALSE) 
names(df) <- c('a', 'foo', 'goo') 
df$foo <- as.numeric(df$foo) 
goodValue <- df$foo 
summary(goodValue) 
hist(goodValue,main="Distribution",xlab="foo",breaks=20) 

enter image description here

回答

3

也許這是你在找什麼?

a = c(rnorm(99), 50) #create some data 
quant <- as.numeric(quantile(a, c(0, 0.9))) #get 0 and 0.9 quantile 
hist(a[a > quant[1] & a < quant[2]]) #histogram only data within these bounds 
+0

感謝華納的想法和投票。我認爲你的解決方案只適用於正常分配?對於任何其他發行版,任何解決方案?順便說一句,我想我可以寫一個函數來計算任何一組數據(即可以是任何類型分佈)的90%百分位數,在這個問題中,我只是問是否有內置方法。 –

+0

@ZheyuanLi,投票支持你的回覆。我知道分位數是什麼意思,我的意思是在代碼中,它使用'rnorm',我認爲它基於數據正態分佈的假設來計算分位數? –

+1

@LinMa我使用'rnorm'來創建一些數據。無論分佈如何,「分位數」都可用於矢量。 @ZheyuanLi我同意你的短代碼版本。我只是說明如果選擇上限和下限,它會是什麼樣子。 – Warner

2

假設您想檢查鑽石。 (我沒有你的數據)

library(ggplot2) 
library(dplyr) 
diamonds %>% ggplot() + geom_histogram(aes(x = price)) 

enter image description here

,可能會決定檢查您的數據的十分位數,而且由於尾概率是不感興趣的話,你可能會丟掉頂部最高的十分位。你可以這樣做,如下所示,用一個自由標度,這樣你就可以看到每個十分位數內發生了什麼。

diamonds %>% mutate(ntile = ntile(price, 10)) %>% 
    filter(ntile < 10) %>% 
    ggplot() + geom_histogram(aes(x = price)) + 
    facet_wrap(~ntile, scales = "free_x") 

但要謹慎雖然在更精細的粒度看到你的數據有它的好處,注意你怎麼可能幾乎勉強告訴你的數據是大致指數分佈(用重尾,因爲大宗商品價格數據經常是)。

enter image description here

+0

謝謝shayaa,投票了。對於這一行,'filter(ntile < 10) %>%','%'是什麼意思?是命令行提示符嗎?我正在使用R Studio,所以有點困惑。謝謝。 –

+1

函數'%>%'是一個特殊的函數從'dplyr'包中導入''magrittr'包,它意味着在'%>%'之前採用先驗函數,並在'%>%'之後將其作爲第一個參數提供給先行函數。例如,在這種情況下,它需要鑽石數據集並將其作爲第一個參數提供給'mutate'函數,該函數以'.data'作爲第一個參數 – shayaa

+1

它可以被理解爲「然後」,例如,採取鑽石「,然後」添加一列指定哪個價格是十分位「,然後」刪除最大的十分位數「,然後」將它作爲一個直方圖沿自由x軸繪製。「 – shayaa