使用2级因子列变量

时间:2015-08-29 15:29:15

标签: r dataframe

我正在尝试随机化我的数据收集。我将观察10只动物(baboon_list),每只动物进行4次(上午2点和下午2点)。所以总共有40个会话。

baboon_list=rep(c("Hound","Sunflower","Nick","Pompom",
                  "CrookedTail","Hugger","R","Chris","Puncture","Brown"),each=4)

session_vec=rep(c("AM","PM"),each=1,times=20)

sampling=data.frame(baboon_list,session_vec)

randomized_sampling=sampling[sample(nrow(sampling)),]

我希望随机观察他们的方式。我创建了一个随机数据框,但我希望它与交替的am和pm会话一起列出。也就是说,行应该是随机的,但是在交替的am和pm会话中排列。我怎么做? 目前,我将baboon_list向量随机化,然后将其与session_vec结合到一个解决了我目的的数据框中。

data.frame(sample(baboon_list),session_vec)

如果我得到这样的数据帧并且我必须重新排列它怎么样?我应该解构该数据框并使用我的方法重建吗? 很抱歉,如果这是一个微不足道的问题,我是R和统计数据的新手。

2 个答案:

答案 0 :(得分:0)

从你的"排序"开始sampling数据框,您可以执行以下操作。对于每只狒狒,从剩余的行中选择4个随机行(rr)位置,并用随机行值标记这些狒狒行。然后从可用行(! rows %in% rr)中删除行位置,并重复下一个狒狒。

baboons = levels(sampling$baboon_list)
rows = 1:nrow(sampling)
d = data.frame()
for (i in 1:length(baboons)) {
  n = nrow(sampling[baboon_list=='R',])
  rr = sort(sample(rows,n))   # 4 random row positions
  d = rbind(d,
            data.frame(sampling[baboon_list==baboons[i],], rr) )
  rows = rows[! rows %in% rr]  # remove the 4 row positions
}
subset(d, baboon_list=='Brown')

   baboon_list session_vec rr
37       Brown          AM  2
38       Brown          PM  6
39       Brown          AM 23
40       Brown          PM 30

答案 1 :(得分:0)

一种简单的方法是使用gdata包中的函数interleave。首先,您将数据框随机化,然后以交替顺序交织行:

set.seed(1)
df <- sampling[sample(nrow(sampling), 40), ]
library(gdata)
interleave(df[df$session_vec=="AM",], df[df$session_vec=="PM",])

输出:

   baboon_list session_vec
11        Nick          AM
22      Hugger          PM
15      Pompom          AM
34    Puncture          PM
33    Puncture          AM
8    Sunflower          PM
21      Hugger          AM