在R中按类别随机化数据

时间:2014-11-03 15:25:12

标签: 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(),但这似乎只适用于按行随机化。正如您所看到的,Number类别的大小也不尽相同。基本上我想创建一个看起来像这样的新矩阵:

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将每个新的Number类别识别为一个独特的事件,然后按每个新事件随后重新组织数据,而不是按行。

有没有人知道如何做我在R中尝试做的事情?

1 个答案:

答案 0 :(得分: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