Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 多次分组生成随机序列号_R_Sample - Fatal编程技术网

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
for
replace
中的默认参数是
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