我正在尝试模拟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()
函数生成随机数,但我的问题是根据块长度拆分数据并添加新列。非常感谢任何帮助。
答案 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])
}