为数据帧中的每个组分配随机整数

时间:2020-06-22 20:15:55

标签: r random group-by

给一个数据帧,每个人有三个不同的观察结果,我试图为每个唯一的人分配一个唯一的随机整数。 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的每个级别?

4 个答案:

答案 0 :(得分:0)

我们可以使用base Rsample的“ {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)))

感谢您的输入!