R 多次分组生成随机序列号
我试图通过多次分组生成随机数 比如说,R 多次分组生成随机序列号,r,sample,R,Sample,我试图通过多次分组生成随机数 比如说, > 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 或 如果结果为3 2 1 2 3 3 1 2,则数据将为 ID num 1 A 3 2 A 2 3
> 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
或
如果结果为3 2 1 2 3 3 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))
它失败了。警告
在1:num中与一起出现
我也试过这个
ddply(df,.(ID),function(x) sample(rep(1:num,times=4),replace=FALSE))
错误再次出现,显示为NA/NaN
如果您能告诉我如何解决这个问题,我将不胜感激。我不太清楚您的预期输出
以下示例num
包含替换的1:num
元素,并将示例存储在列表列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
我们可以创建一个列表列,然后unest
将其设置为具有单独的行
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
n%
分组依据(ID)%>%
变异(num=列表(样本(rep(seq_len(num),n)))%>%
tidyr::unnest(num)
#ID编号
#
#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
#…还有50行
谢谢,但有点不同。在data.frame中是否有其他方法将“sample”表示为向量或列?此外,我将把replace设置为“FALSE”。@ESKim如果您能够显式地显示一些最小样本数据的预期输出,这将非常有帮助。这避免了很多混乱。@ESKim要获得您想要的输出,只需unest
我的第二个答案部分的结果。当您从1:3
中选择4个数字时,这将自动使其成为replace=TRUE
。如果显示其中一个run的预期输出,这将非常有用。sample
forreplace
中的默认参数是FALSE
,因此如果您没有明确提及它,默认情况下它被视为FALSE
。
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
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