У меня есть ряд чисел.
n <- c(10, 5, 35, 16, 2)
n <- as.data.frame(n)
Я прогнал эти числа через цикл, который случайным образом выбирает от -18 до 18 раз количество значений, например 10, 5.
p <- list()
for(i in 1:nrow(n)) {
p[[i]] <- sample(-18:18, n$n[i], replace = TRUE)
}
Вывод выглядит следующим образом:
[[1]]
[1] 6 1
[[2]]
[1] 4 1 12 -8 -9
[[3]]
[1] -13 -18 18
[[4]]
[1] 17 -4 9 17
[[5]]
[1] -2 18
Как мне преобразовать это в фрейм данных, который также имеет переменную идентификатора, соответствующую заказу? Я хочу, чтобы результат выглядел так:
CT ID
6 1
1 1
4 2
1 2
12 2
-8 2
-9 2
-13 3
-18 3
18 3
17 4
-4 4
9 4
17 4
-2 5
18 5
Мои фактические данные содержат около 300 ячеек/списков переменных, которые необходимо преобразовать. Я попытался создать еще один цикл, но продолжал сталкиваться с синтаксическими ошибками.
n <- c(10, 5, 35, 16, 2)
s <- lapply(
seq_along(n),
\(i) data.frame(CT = sample(-18:18, n[i], replace = TRUE), ID = i)
)
do.call(rbind.data.frame, s)
дает:
CT ID 1 9 1 2 -15 1 3 10 1 4 10 1 5 -9 1 6 -3 1 7 3 1 8 18 1 9 2 1 10 15 1
Используя tidyverse
:
n <- c(10, 5, 35, 16, 2)
map(n, \(N) data.frame(CT = sample(-18:18, N, replace = TRUE))) |>
bind_rows(.id = 'ID')
Если один призыв к выборке (т. е. sum(n)
) не то, что вам нужно, мы можем Vectorise
sample()
поставить лайк
set.seed(1)
n = c(10, 5, 35, 16, 2)
data.frame(ID=rep(seq(n), n),
CT=unlist(Vectorize(sample, "size")(-18:18, n, TRUE)))
предоставление
ID CT
1 1 -15
2 1 -18
3 1 15
4 1 4
5 1 -5
6 1 -1
7 1 14
8 1 2
9 1 2
10 1 -9
11 2 -12
12 2 -10
13 2 -4
14 2 2
15 2 18
16 3 6
17 3 18
18 3 18
19 3 15
20 3 6
21 3 -4
22 3 14
23 3 1
24 3 16
25 3 -13
26 3 -9
27 3 1
28 3 9
29 3 1
30 3 4
31 3 -13
32 3 6
33 3 -13
34 3 -13
35 3 5
36 3 13
37 3 -5
38 3 -17
39 3 -1
40 3 3
41 3 -5
42 3 -18
43 3 -13
44 3 4
45 3 -13
46 3 -8
47 3 -2
48 3 17
49 3 -6
50 3 6
51 4 6
52 4 4
53 4 1
54 4 10
55 4 -6
56 4 3
57 4 10
58 4 9
59 4 14
60 4 2
61 4 12
62 4 -2
63 4 -10
64 4 4
65 4 0
66 4 7
67 5 11
68 5 13
Вот еще два варианта
dplyr
с enframe
+ unnest
n %>%
map(sample, x = -18:18, replace = TRUE) %>%
enframe() %>%
unnest(value)
что дает
# A tibble: 68 × 2
name value
<int> <int>
1 1 -15
2 1 -18
3 1 15
4 1 4
5 1 -5
6 1 -1
7 1 14
8 1 2
9 1 2
10 1 -9
# ℹ 58 more rows
# ℹ Use `print(n = ...)` to see more rows
lapply
+ stack
stack(
lapply(
setNames(n,seq_along(n)),
sample,
x = -18:18,
replace = TRUE
)
)
что дает
values ind
1 -15 1
2 -18 1
3 15 1
4 4 1
5 -5 1
6 -1 1
7 14 1
8 2 1
9 2 1
10 -9 1
11 -12 2
12 -10 2
13 -4 2
14 2 2
15 18 2
16 6 3
17 18 3
18 18 3
19 15 3
20 6 3
21 -4 3
22 14 3
23 1 3
24 16 3
25 -13 3
26 -9 3
27 1 3
28 9 3
29 1 3
30 4 3
31 -13 3
32 6 3
33 -13 3
34 -13 3
35 5 3
36 13 3
37 -5 3
38 -17 3
39 -1 3
40 3 3
41 -5 3
42 -18 3
43 -13 3
44 4 3
45 -13 3
46 -8 3
47 -2 3
48 17 3
49 -6 3
50 6 3
51 6 4
52 4 4
53 1 4
54 10 4
55 -6 4
56 3 4
57 10 4
58 9 4
59 14 4
60 2 4
61 12 4
62 -2 4
63 -10 4
64 4 4
65 0 4
66 7 4
67 11 5
68 13 5
set.seed(1)
n <- c(10, 5, 35, 16, 2)
Если этот вопрос отражает вашу реальную проблему, выборка n раз по количеству строк аналогична взятию одной большой выборки, если
replace=TRUE
. Например.data.frame(ID = rep(seq_along(n$n), n$n), CT = sample(-18:18, sum(n$n), replace=TRUE))
- это нормально?