2015-02-23 68 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