2014-11-03 86 views
2

所以我对R有点新,所以如果这是一个愚蠢的问题,请原谅我。我有行为的数据集,看起来是这样的:在R中随机分类数据

time  behavior 
10:04:36 FEED  
10:04:37 FEED  
10:04:38 REST 
10:04:39 REST 
10:04:40 RUN 

等。

我添加了一个列数每一个新的行为作为一个唯一的编号,是这样的:

time  behavior Number 
10:04:36 FEED  1 
10:04:37 FEED  1 
10:04:38 REST  2 
10:04:39 REST  2 
10:04:40 RUN  3 

因此,如果10:04:36和10:30:00的行为都是FEED,则它们仍然被视为不同的行为事件,因为它们具有不同的数字。然后,我通过行为类别对我的数据进行子集化,以便获得所有行为的数据集。然而,在这组数据我有一些类别每次我有一个新的行为事件,例如:

time  behavior Number 
10:04:36 FEED  1 
10:04:37 FEED  1 
10:30:00 FEED  10 
10:30:01 FEED  10 
10:30:02 FEED  10 
11:01:00 FEED  21 
11:01:01 FEED  21 

等等

现在,我想这样做是随机化这一新数据集按数字类别。因此,我想告诉R使用相同的Number值来获取每个数据块并重新组织这些块。我尝试使用sample(),但似乎只能用于按行随机化。正如你所看到的,数字类别的大小也不尽相同。基本上我想创建一个新的矩阵,看起来是这样的:

time  behavior Number 
10:30:00 FEED  10 
10:30:01 FEED  10 
10:30:02 FEED  10  
11:01:00 FEED  21 
11:01:01 FEED  21 
10:04:36 FEED  1 
10:04:37 FEED  1 

所以,我会如R每一个新的事件来识别每一个新的编号类别作为一个独特的事件,并随机重新组织数据,不按行。

有没有人知道一种方法来做我想在R做什么?

+0

你能给所需的输出,我不知道你想要什么。对于最后一块代码,你想对它做什么?如果我同时使用'Number == 1'行,您希望它们是如何排列的? – 2014-11-03 15:33:39

+0

我不确定我是否遵循,但是您可能只需使用'sample'创建一个新列,例如'df $ NewOrder < - sample(df $ Number)',然后对它的数据集进行重新排序,即' df < - df [order(df $ NewOrder),]' – 2014-11-03 15:34:28

+0

嗨,我很抱歉的混淆,我仍然在想方设法弄清楚我的观点。我做了一些编辑,现在更有意义了吗? – 2014-11-03 16:07:56

回答

0

您可以创建一个辅助功能可按如

reorderingFunc <- function(data, indxCol){ 
    indx <- sample(unique(data[, indxCol])) 
    data[order(unique(data[, indxCol])[match(data[, indxCol], indx)]), ] 
} 

测试

set.seed(111) # Setting a seed so the outcome of `sample` be reproducible 
reorderingFunc(df, "Number") 
#  time behavior Number 
# 3 10:30:00  FEED  10 
# 4 10:30:01  FEED  10 
# 5 10:30:02  FEED  10 
# 6 11:01:00  FEED  21 
# 7 11:01:01  FEED  21 
# 1 10:04:36  FEED  1 
# 2 10:04:37  FEED  1 
+0

如果你不使用'set.seed',你每次都会给出不同的结果('set.seed'只是为了重现你想要的精确输出)。 – 2014-11-03 16:36:48

+1

工作得很好,非常感谢! – 2014-11-03 16:38:57