多次按组生成随机序号
Generate random sequential number by group with multiple times
我尝试多次按组生成随机数。
例如,
> set.seed(1002)
> df<-data.frame(ID=LETTERS[seq(1:5)],num=sample(c(2,3,4), size=5, replace=TRUE))
> df
ID num
1 A 3
2 B 4
3 C 3
4 D 2
5 E 3
在ID
中,我想生成顺序随机数而不用(例如)4次替换。
如果ID
是A,它会在1:3
中随机select个数4次。所以,这将是
sample(c(1,2,3,1,2,3,1,2,3),replace=FALSE)
或
ep(sample(c(1:4), replace=FALSE),times=4)
如果结果为3 2 1 2 1 3 2 3 3 1 1 2
,则数据为
ID num
1 A 3
2 A 2
3 A 2
4 A 1
5 A 1
6 A 3
7 A 2
8 A 1
9 A 3
我尝试了几种方法,例如
df%>%group_by(ID)%>%mutate(random=sample(rep(1:num,times=4),replace=FALSE))
失败了。 warning
与 In 1:num
一起出现
这个我也试过了
ddply(df,.(ID),function(x) sample(rep(1:num,times=4),replace=FALSE))
错误再次出现,NA/NaN
。
如果你告诉我如何解决这个问题,我将不胜感激。
我不太清楚你的预期输出。
以下示例 num
来自 1:num
的元素并进行了替换,并将示例存储在 list
列中 sample
。
library(tidyverse)
set.seed(2018)
df %>% mutate(sample = map(num, ~sample(1:.x, replace = T)))
# ID num sample
#1 A 2 1, 1
#2 B 4 3, 4, 1, 2
#3 C 2 1, 1
#4 D 4 3, 3, 4, 4
#5 E 2 2, 2
或者如果你想重复采样num
个元素(带替换)4次,你可以
set.seed(2018)
df %>%
mutate(sample = map(num, ~as.numeric(replicate(4, sample(1:.x, replace = T)))))
#ID num sample
#1 A 2 1, 1, 1, 2, 1, 2, 1, 1
#2 B 4 3, 3, 4, 4, 4, 4, 4, 2, 3, 4, 3, 3, 2, 1, 1, 2
#3 C 2 1, 1, 1, 1, 1, 1, 1, 2
#4 D 4 2, 3, 2, 1, 3, 4, 1, 2, 1, 2, 2, 1, 1, 1, 2, 1
#5 E 2 2, 1, 2, 2, 1, 1, 1, 2
我们可以创建一个列表列,然后 unnest
它有单独的行。
n <- 4
library(dplyr)
df %>%
group_by(ID) %>%
mutate(num = list(sample(rep(seq_len(num), n)))) %>%
tidyr::unnest(num)
# ID num
# <fct> <int>
# 1 A 2
# 2 A 2
# 3 A 2
# 4 A 3
# 5 A 3
# 6 A 1
# 7 A 3
# 8 A 1
# 9 A 1
#10 A 3
# … with 50 more rows
我尝试多次按组生成随机数。
例如,
> set.seed(1002)
> df<-data.frame(ID=LETTERS[seq(1:5)],num=sample(c(2,3,4), size=5, replace=TRUE))
> df
ID num
1 A 3
2 B 4
3 C 3
4 D 2
5 E 3
在ID
中,我想生成顺序随机数而不用(例如)4次替换。
如果ID
是A,它会在1:3
中随机select个数4次。所以,这将是
sample(c(1,2,3,1,2,3,1,2,3),replace=FALSE)
或
ep(sample(c(1:4), replace=FALSE),times=4)
如果结果为3 2 1 2 1 3 2 3 3 1 1 2
,则数据为
ID num
1 A 3
2 A 2
3 A 2
4 A 1
5 A 1
6 A 3
7 A 2
8 A 1
9 A 3
我尝试了几种方法,例如
df%>%group_by(ID)%>%mutate(random=sample(rep(1:num,times=4),replace=FALSE))
失败了。 warning
与 In 1:num
这个我也试过了
ddply(df,.(ID),function(x) sample(rep(1:num,times=4),replace=FALSE))
错误再次出现,NA/NaN
。
如果你告诉我如何解决这个问题,我将不胜感激。
我不太清楚你的预期输出。
以下示例 num
来自 1:num
的元素并进行了替换,并将示例存储在 list
列中 sample
。
library(tidyverse)
set.seed(2018)
df %>% mutate(sample = map(num, ~sample(1:.x, replace = T)))
# ID num sample
#1 A 2 1, 1
#2 B 4 3, 4, 1, 2
#3 C 2 1, 1
#4 D 4 3, 3, 4, 4
#5 E 2 2, 2
或者如果你想重复采样num
个元素(带替换)4次,你可以
set.seed(2018)
df %>%
mutate(sample = map(num, ~as.numeric(replicate(4, sample(1:.x, replace = T)))))
#ID num sample
#1 A 2 1, 1, 1, 2, 1, 2, 1, 1
#2 B 4 3, 3, 4, 4, 4, 4, 4, 2, 3, 4, 3, 3, 2, 1, 1, 2
#3 C 2 1, 1, 1, 1, 1, 1, 1, 2
#4 D 4 2, 3, 2, 1, 3, 4, 1, 2, 1, 2, 2, 1, 1, 1, 2, 1
#5 E 2 2, 1, 2, 2, 1, 1, 1, 2
我们可以创建一个列表列,然后 unnest
它有单独的行。
n <- 4
library(dplyr)
df %>%
group_by(ID) %>%
mutate(num = list(sample(rep(seq_len(num), n)))) %>%
tidyr::unnest(num)
# ID num
# <fct> <int>
# 1 A 2
# 2 A 2
# 3 A 2
# 4 A 3
# 5 A 3
# 6 A 1
# 7 A 3
# 8 A 1
# 9 A 1
#10 A 3
# … with 50 more rows