给一个数据帧,每个人有三个不同的观察结果,我试图为每个唯一的人分配一个唯一的随机整数。
df <- data.frame(sample = 1:15, ID = rep(1:5, times = 3))
sample ID
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 1
7 7 2
8 8 3
9 9 4
10 10 5
11 11 1
12 12 2
13 13 3
14 14 4
15 15 5
在这种情况下,我希望每个ID在1到5之间有一个随机值'newvar'。
我尝试过
df %>% group_by(ID) %>% mutate(newvar = sample(5, n(), replace = FALSE))
在每个ID中,新变量不会保持不变,并且
df %>% group_by(ID) %>% mutate(newvar = sample.int(n()))
给出每个组中1到3之间的随机数,并且
df %>% group_by(ID) %>% mutate(newvar = sample(5, replace = FALSE))
不起作用,因为它希望newvar为1或3,而不是5。
我也尝试使用ID级别:
levels(df$ID) <- sample(length(levels(df$ID))) df$newvar <- levels(df$ID)
这将ID列随机化,并将其写入测试df上的newvar
sample ID newvar
1 1 5 5
2 2 2 2
3 3 1 1
4 4 4 4
5 5 3 3
6 6 5 5
7 7 2 2
8 8 1 1
9 9 4 4
10 10 3 3
11 11 5 5
12 12 2 2
13 13 1 1
14 14 4 4
15 15 3 3
在我的完整数据集(对306个个体的918个观察值)上,它抛出一个错误:
Error: Assigned data `value` must be compatible with existing data. x Existing data has 918 rows. x Assigned data has 306 rows. ℹ Only vectors of size 1 are recycled.
是否有办法使sample()发生在group_by命令中,或获取正确分配给随机整数的ID的每个级别?
答案 0 :(得分:0)
我们可以使用base R
来sample
的“ {ID”值”,然后在将名称设置为unique
“ ID”后与“ ID”匹配。当“ ID”不是数字或不遵循从1开始的序列时,这也应该起作用
unique
答案 1 :(得分:0)
仅用ID替换长度为5的样本怎么样?
df %>% mutate(newvar = sample(5)[ID])
#> sample ID newvar
#> 1 1 1 4
#> 2 2 2 5
#> 3 3 3 3
#> 4 4 4 2
#> 5 5 5 1
#> 6 6 1 4
#> 7 7 2 5
#> 8 8 3 3
#> 9 9 4 2
#> 10 10 5 1
#> 11 11 1 4
#> 12 12 2 5
#> 13 13 3 3
#> 14 14 4 2
#> 15 15 5 1
答案 2 :(得分:0)
为最符合您的思维方式,这会为1至5之间的每个ID分配一个一致的样本。
df %>%
group_by(ID) %>%
mutate(newvar = sample(5, 1))
答案 3 :(得分:0)
这就是我想要的:首先将ID复制到newvar,然后在各个级别上复制sample()。
df$ID <- as.factor(df$ID)
df$newvar <- df$ID
levels(df$newvar) <- sample(length(levels(df$newvar)))
感谢您的输入!