2013-03-07 56 views
3

快速的問題。我正在用一些不同的方式對變量進行探索性數據分析。假設我在data.frame df中有一個名爲var的變量。根據設定的觀察次數分箱變量

df$var<-c(1,2,8,9,4,5,6,3,6,9,3,4,5,6,7,8,9,2,3,4,6,1,2,3,7,8,9,0) 

到目前爲止,我已經採用以下方法(下面的代碼):

#Divide into quartiles 
df$var_quartile <- with(df, cut(var, breaks=quantile(var, probs=seq(0,1, by=.25)), include.lowest=TRUE)) 
# Values of var_quartile 
> [0,3],[0,3],(7.25,9],(7.25,9],(3,5],(3,5],(5,7.25],[0,3],(5,7.25],(7.25,9],[0,3],(3,5],(3,5],(5,7.25],(5,7.25],(7.25,9],(7.25,9],[0,3],[0,3],(3,5],(5,7.25],[0,3],[0,3],[0,3] 

#Bin into increments of 2 
df$var_bin<- cut(df[['var']],2, include.lowest=TRUE, labels=1:2) 
# Values of var_bin 
> 1 1 2 2 1 2 2 1 2 2 1 1 2 2 2 2 2 1 1 1 2 1 1 1 2 2 2 1 

,我想做的最後一件事是斌的可變進後的10個觀察部分已按照時間順序排序。在找到中位數後,這是一種相同的分裂方法(數到中間觀察值),只有我想以10個觀察增量計數。

使用我的例子,這將拆分var分爲以下幾個部分:

0,1,1,2,2,2,3,3,3,3 
4,4,4,5,5,6,6,6,6,7 
7,8,8,8,9,9,9 

注: - 我需要在非常大的數據集中運行這個操作(通常是3-6百萬個廣泛的觀察)。

我該怎麼做?謝謝!

+0

請提供可再生的數據。 – Arun 2013-03-07 15:14:38

+0

@roody我想你會在'plyr'包中找到很多這樣的工作實用程序。你可以使用函數'ddply'和'mutate'函數爲你的bin idex創建不同的新列。您也可以使用'zoo'包中的滾動函數將觀察值分組爲10。 – Dinre 2013-03-07 15:19:41

+0

如果數據如下所示,那麼期望的結果是:var < - c(rep(1,11),rep(2,3) ,rep(3,9),rep(4,20))'甚至是'sample(1:10,100,repl = TRUE)',因爲我確信這些值中會有一些值更大比10更好。 – 2013-03-07 15:27:25

回答

4
vec <- c(1,2,8,9,4,5,6,3,6,9,3,4,5,6,7,8,9,2,3,4,6,1,2,3,7,8,9,0) # your vector 

nObs <- 10 # number of observations per bin 

# create data labels 
datLabels <- ceiling(seq_along(vec)/nObs)[rank(vec, ties.method = "first")] 


# test data labels: 
split(vec, datLabels) 

$`1` 
[1] 1 2 3 3 2 3 1 2 3 0 

$`2` 
[1] 4 5 6 6 4 5 6 7 4 6 

$`3` 
[1] 8 9 9 8 9 7 8 9 
+0

(+1)非常好的使用'rank'。我會記住這一點! – Arun 2013-03-07 17:07:47

1

你的意思是這樣的嗎?

x <- sample(100) 
binSize <- 10 
table(floor(x/binSize)*binSize) 
0

這應該這樣做。

df$var_bin<- cut(df[['var']], breaks = Size(df$var/10), 
       include.lowest=TRUE, labels=1:10) 
+0

R給我錯誤「找不到函數」Size「'。思考? – roody 2013-03-07 15:48:06

+0

嘗試改爲:'nrow(df $ var)/ 10' – 2013-03-08 20:13:07

6

cut_number()GGPLOT2被設計來切割數值向量到含有點的相等數目的區間。在你的情況,你可以使用它像這樣:

library(ggplot2) 
split(var, cut_number(var, n=3, labels=1:3)) 
# $`1` 
# [1] 1 2 3 3 2 3 1 2 3 0 
# 
# $`2` 
# [1] 4 5 6 6 4 5 6 4 6 
# 
# $`3` 
# [1] 8 9 9 7 8 9 7 8 9 
+0

(+1)*非常方便的功能! – Arun 2013-03-07 17:08:02

+0

+1,同意!謝謝! – roody 2013-03-07 19:05:15

1

我創造了同等大小的羣體,而不使用切割。

number_of_groups_wanted =行數/英寸的天花板代碼除數

因此除數在天花板代碼應該=行/ number_of_groups_wanted的數目,

除數在天花板代碼=(nrow(DF)/ number_of_groups_wanted)

分鐘每分配捆綁元件的最低等級

number_of_groups_wanted = 100 # put in the number of groups you want 
df$group = ceiling(rank(df$var_to_group, ties.method = "min")/(nrow(df)/number_of_groups_wanted)) 

df$rank = rank(df$var_to_group, ties.method = "min") # this line is just used to check data