按R数据帧中的数据块长度生成随机数

时间:2012-01-06 12:38:22

标签: r random split simulation

我正在尝试模拟n次测量顺序,看看测量顺序如何影响我的研究对象。为此,我尝试生成整数随机数到数据帧中的新列。我有一个很大的数据帧,我想根据块中的观察数量在数据帧中添加一个包含随机数的列。

数据示例(每行是观察):

df <- data.frame(A=c(1,1,1,2,2,3,3,3,3), 
                 B=c("x","b","c","g","h","g","g","u","l"), 
                 C=c(1,2,4,1,5,7,1,2,5))


  A B C
1 1 x 1
2 1 b 2
3 1 c 4
4 2 g 1
5 2 h 5
6 3 g 7
7 3 g 1
8 3 u 2
9 3 l 5

我想要做的是添加一个D列,并根据每个块的长度生成随机整数。块在A列中定义。

结果应如下所示:

df <- data.frame(A=c(1,1,1,2,2,3,3,3,3), 
                 B=c("x","b","c","g","h","g","g","u","l"), 
                 C=c(1,2,4,1,5,7,1,2,5),
                 D=c(2,1,3,2,1,4,3,1,2))

> df
  A B C D
1 1 x 1 2
2 1 b 2 1
3 1 c 4 3
4 2 g 1 2
5 2 h 5 1
6 3 g 7 4
7 3 g 1 3
8 3 u 2 1
9 3 l 5 2

我曾尝试使用R:s sample()函数生成随机数,但我的问题是根据块长度拆分数据并添加新列。非常感谢任何帮助。

3 个答案:

答案 0 :(得分:4)

可以使用ave

轻松完成
df$D <- ave( df$A, df$A, FUN = function(x) sample(length(x)) )

(你可以用max()替换length(),或者其他什么,但是即使A不是与它们的块长度匹配的数字,长度也会起作用)

答案 1 :(得分:2)

来自ddply的{​​{1}}非常简单。

plyr

手册版本较长:

使用ddply(df, .(A), transform, D = sample(length(A))) 按第一列拆分数据框。

split

然后在列表的每个成员上调用split_df <- split(df, df$A)

sample

然后与

重新组合
split_df <- lapply(split_df, function(df) 
{
  df$D <- sample(nrow(df))
  df
})

答案 2 :(得分:1)

一个简单的方法:

df$D = 0

counts = table(df$A)

for (i in 1:length(counts)){
    df$D[df$A == names(counts)[i]] = sample(counts[i])
}