如何使用 rnorm 为每个 ID(总共 1000 个 ID)生成相同的值?
How to generate the same value per ID (for 1000 IDs in total) with rnorm?
我想创建一个data.frame
,其中应该包含一个参数值(体表面积,BSA)。它应该在这个 data.frame
中使用 rnorm()
为 1000 个 ID 生成。有
BSA<-data.frame(rep(rnorm(n = 1000, mean = 1.81, sd = 0.2)))
我可以轻松获得 1000 个 ID 的那些值。但是,我希望每个 ID 不仅有 1 个观测值,而且有 36 个观测值。如何根据上述平均值和 SD 为一个 ID 生成相同的 BSA 值 36 次,并对总共 1000 个 ID 执行此过程?
不幸的是,
data.frame(rep(rnorm(1, 1.81, 0.2), times=36),times = 1000))
当然不行。
编辑:输出应如下所示:
1.89
1.89
1.89
1.67
1.67
1.67
1.74
1.74
1.74
这将是一列中每个 ID 的三个观察值。
编辑2:
代码可能如下所示:
BSA<-data.frame(c(rep(rnorm(1, 1.81, 0.2), times=36), rep(rnorm(1, 1.81, 0.2), times=36)))
这将为两个 ID 生成所需的输出,但为 1000 个 ID 执行此操作不太可行。
原则上可以用cbind
,每个"id"
抽一个rnorm
。
n <- 36 ## 36 IDs
o <- 5 ## 5 observations (change to 1000 in your case)
set.seed(42)
res <- do.call(rbind.data.frame, lapply(1:n, function(i)
cbind(id=i, o=1:o, v=rnorm(1, 1.81, .2))))
res[1:15, ]
# id o v
# 1 1 1 2.084192
# 2 1 2 2.084192
# 3 1 3 2.084192
# 4 1 4 2.084192
# 5 1 5 2.084192
# 6 2 1 1.697060
# 7 2 2 1.697060
# 8 2 3 1.697060
# 9 2 4 1.697060
# 10 2 5 1.697060
# 11 3 1 1.882626
# 12 3 2 1.882626
# 13 3 3 1.882626
# 14 3 4 1.882626
# 15 3 5 1.882626
或者,如果你想要一个向量,混合 rep
和 replicate
,然后 c
连接结果,
set.seed(42)
res2 <- do.call(c, replicate(n, rep(rnorm(1, 1.81, .2), o), simplify=F))
使用 rep
的 each=
参数更简单(感谢 @Onyambu)。
set.seed(42)
res2 <- rep(rnorm(o, 1.81, .2), each=n)
res2[1:15]
# [1] 2.084192 2.084192 2.084192 2.084192 2.084192 1.697060
# [7] 1.697060 1.697060 1.697060 1.697060 1.882626 1.882626
# [13] 1.882626 1.882626 1.882626
要获取数据框,当然只需执行 as.data.frame(res2)
或类似操作。
我想创建一个data.frame
,其中应该包含一个参数值(体表面积,BSA)。它应该在这个 data.frame
中使用 rnorm()
为 1000 个 ID 生成。有
BSA<-data.frame(rep(rnorm(n = 1000, mean = 1.81, sd = 0.2)))
我可以轻松获得 1000 个 ID 的那些值。但是,我希望每个 ID 不仅有 1 个观测值,而且有 36 个观测值。如何根据上述平均值和 SD 为一个 ID 生成相同的 BSA 值 36 次,并对总共 1000 个 ID 执行此过程?
不幸的是,
data.frame(rep(rnorm(1, 1.81, 0.2), times=36),times = 1000))
当然不行。
编辑:输出应如下所示:
1.89
1.89
1.89
1.67
1.67
1.67
1.74
1.74
1.74
这将是一列中每个 ID 的三个观察值。
编辑2: 代码可能如下所示:
BSA<-data.frame(c(rep(rnorm(1, 1.81, 0.2), times=36), rep(rnorm(1, 1.81, 0.2), times=36)))
这将为两个 ID 生成所需的输出,但为 1000 个 ID 执行此操作不太可行。
原则上可以用cbind
,每个"id"
抽一个rnorm
。
n <- 36 ## 36 IDs
o <- 5 ## 5 observations (change to 1000 in your case)
set.seed(42)
res <- do.call(rbind.data.frame, lapply(1:n, function(i)
cbind(id=i, o=1:o, v=rnorm(1, 1.81, .2))))
res[1:15, ]
# id o v
# 1 1 1 2.084192
# 2 1 2 2.084192
# 3 1 3 2.084192
# 4 1 4 2.084192
# 5 1 5 2.084192
# 6 2 1 1.697060
# 7 2 2 1.697060
# 8 2 3 1.697060
# 9 2 4 1.697060
# 10 2 5 1.697060
# 11 3 1 1.882626
# 12 3 2 1.882626
# 13 3 3 1.882626
# 14 3 4 1.882626
# 15 3 5 1.882626
或者,如果你想要一个向量,混合 rep
和 replicate
,然后 c
连接结果,
set.seed(42)
res2 <- do.call(c, replicate(n, rep(rnorm(1, 1.81, .2), o), simplify=F))
使用 rep
的 each=
参数更简单(感谢 @Onyambu)。
set.seed(42)
res2 <- rep(rnorm(o, 1.81, .2), each=n)
res2[1:15]
# [1] 2.084192 2.084192 2.084192 2.084192 2.084192 1.697060
# [7] 1.697060 1.697060 1.697060 1.697060 1.882626 1.882626
# [13] 1.882626 1.882626 1.882626
要获取数据框,当然只需执行 as.data.frame(res2)
或类似操作。