将列表转换为数据框

Converting Lists into Data Frames

我正在尝试制作一个包含 3 列(和 100 行)的数据框,其中包含随机数,以便每行中的随机数加起来为 72。

我正在使用此代码生成随机数:

random_numbers <- diff(c(0, sort(sample(72, 2)), 72))

不过,由于格式原因,我无法将这些随机数“装入”数据框中。例如:

i <- 1:100
d <- data.frame(i)
d$rand <- diff(c(0, sort(sample(72, 2)), 72))
Error in `$<-.data.frame`(`*tmp*`, rand, value = c(37, 21, 14)) : 
  replacement has 3 rows, data has 100

我有另一个想法,至少我可以创建所有 100 个随机数:

results <- list()

for (i in 1:100) {
  r_i <- diff(c(0, sort(sample(72, 2)), 72))
  results[[i]] <- r_i
}

results[1]
# [[1]]
# [1]  3 19 50

results[2]
# [[1]]
# [1] 16 11 45

但我不确定如何根据这些数据创建一个包含 3 列和 100 行的数据框。

我知道如何在“经典”意义上做到这一点:

i <- 1:100
r_1 <- rnorm(5, 5, 100)
r_2 <- rnorm(5, 5, 100)
r_3 <- rnorm(5, 5, 100)

d <- data.frame(i, r_1, r_2, r_3)

d = data.frame(i, r_1, r_2, r_3)

当然,在上面的数据框中,这 3 个数字加起来肯定不会等于 72。

是否可以将我上面生成的100个随机数results放入数据框中?

我们可以使用 replicate 并将 n 指定为 'd' 的行数,并从 matrix 输出

分配新列
d[paste0("r_", 1:3)] <-  t(replicate(nrow(d), 
     diff(c(0, sort(sample(72, 2)), 72))))

-相等性测试

> all(rowSums(d[-1]) == 72)
[1] TRUE