2015-02-23 78 views
1

我有這樣如何根據百分比劃分數據集?

ID  var value 
9442000 a 2.01 
9442000 v 2.2 
9442000 h 5.3 
9442000 f 0.2 
9442000 s 0.55 
9442000 t 0.6 
952001 d 0.22 
952001 g 0.44 
952001 g 0.44 
952001 h 0.77 
652115 a 4.66 
652115 d 1.55 
652115 s 2.55 
652115 s 2.55 

我想這分成兩個dataframes用於校準(75%)和驗證(25%)的數據集。爲整體做這件事很簡單,但我想要做到這一點。所以基本上,我想確保75%的EACH ID進行校準。例如,對於ID ,我想將任何四個事件(隨機)放入校準中,將2放入驗證數據幀中。

預期輸出:

*Calibration* 
ID var value 
9442000 a 2.01 
9442000 v 2.2 
9442000 h 5.3 
9442000 f 0.2 
952001 d 0.22 
952001 g 0.44 
952001 g 0.44 
652115 a 4.66 
652115 d 1.55 
652115 s 2.55 

而且

*validation* 
ID var value 
9442000 s 0.55 
9442000 t 0.6 
952001 h 0.77 
652115 s 2.55 

回答

2

首先,定義該組它會在一個變量,然後使用split

> df$test <- ave(df$ID,df$ID,FUN=function(X) seq_along(X) %% 4 == 1 ) 
> 
> split(df, df$test) 
$`0` 
     ID var value test 
2 9442000 v 2.20 0 
3 9442000 h 5.30 0 
4 9442000 f 0.20 0 
6 9442000 t 0.60 0 
8 952001 g 0.44 0 
9 952001 g 0.44 0 
10 952001 h 0.77 0 
12 652115 d 1.55 0 
13 652115 s 2.55 0 
14 652115 s 2.55 0 

$`1` 
     ID var value test 
1 9442000 a 2.01 1 
5 9442000 s 0.55 1 
7 952001 d 0.22 1 
11 652115 a 4.66 1 
+0

要隨機樣本,您可以用'樣品(長度(X))',而不是'seq_along(X)'在函數中。 – 2015-02-25 00:56:24

3

我還以爲你想要一個隨機sample和我原來的方法與ave下降烈焰因爲段太短,所以我轉過身來,tapplyunlist -ed結果

calib <- dat[ unlist(tapply(rownames(dat), dat$ID, 
             FUN=function(x) sample(x, .75*length(x)))), ] 
valid <- dat[ !rownames(dat) %in% rownames(calib) , ] 
#--------------- 
> str(calib) 
'data.frame': 10 obs. of 3 variables: 
$ ID : int 652115 652115 652115 952001 952001 952001 9442000 9442000 9442000 9442000 
$ var : Factor w/ 8 levels "a","d","f","g",..: 1 6 2 4 2 4 7 8 1 6 
$ value: num 4.66 2.55 1.55 0.44 0.22 0.44 0.6 2.2 2.01 0.55 
> str(valid) 
'data.frame': 4 obs. of 3 variables: 
$ ID : int 9442000 9442000 952001 652115 
$ var : Factor w/ 8 levels "a","d","f","g",..: 5 3 5 6 
$ value: num 5.3 0.2 0.77 2.55 
> 
+0

哦,是的,我需要一個隨機樣本。對不起,我忘了提及它。儘管如此,它也可以工作。你可以發佈你的隨機示例代碼嗎? – maximusdooku 2015-02-23 23:57:44

+1

這是我的隨機示例代碼。 (Neal的代碼不是隨機的) – 2015-02-24 00:15:14

+0

太好了!謝謝! – maximusdooku 2015-02-24 00:54:01