Использование a для l oop для преобразования данных в двоичную переменную в R - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть этот набор данных:

L group  n  y
1   1   10  1
2   1   11  4
3   1   12  9
4   1   4   4
5   1   10  10
6   1   11  9
7   1   9   9
8   1   11  11
9   1   10  10
10  1   10  7
11  1   12  12
12  1   10  9
13  1   8   8
14  1   11  9
15  1   6   4
16  1   9   7
17  1   14  14
18  1   12  7
19  1   11  9
20  1   13  8
21  1   14  5
22  1   10  10
23  1   12  10
24  1   13  8
25  1   10  10
26  1   14  3
27  1   13  13
28  1   4   3
29  1   8   8
30  1   13  5
31  1   12  12
32  2   10  1
33  2   3   1
34  2   13  1
35  2   12  0
36  2   14  4
37  2   9   2
38  2   13  2
39  2   16  1
40  2   11  0
41  2   4   0
42  2   1   0
43  2   12  0
44  3   8   0
45  3   11  1
46  3   14  0
47  3   14  1
48  3   11  0
49  4   3   0
50  4   13  0
51  4   9   2
52  4   17  2
53  4   15  0
54  4   2   0
55  4   14  1
56  4   8   0
57  4   6   0
58  4   17  0

Вот его структура с использованием dput ()

structure(list(litter = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 
12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 
28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 
44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58), 
    group = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 
    2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 
    4, 4, 4, 4), n = c(10, 11, 12, 4, 10, 11, 9, 11, 10, 10, 
    12, 10, 8, 11, 6, 9, 14, 12, 11, 13, 14, 10, 12, 13, 10, 
    14, 13, 4, 8, 13, 12, 10, 3, 13, 12, 14, 9, 13, 16, 11, 4, 
    1, 12, 8, 11, 14, 14, 11, 3, 13, 9, 17, 15, 2, 14, 8, 6, 
    17), y = c(1, 4, 9, 4, 10, 9, 9, 11, 10, 7, 12, 9, 8, 9, 
    4, 7, 14, 7, 9, 8, 5, 10, 10, 8, 10, 3, 13, 3, 8, 5, 12, 
    1, 1, 1, 0, 4, 2, 2, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 
    2, 2, 0, 0, 1, 0, 0, 0)), class = "data.frame", row.names = c(NA, 
-58L))

Я пытаюсь повернуть эти данные, чтобы создать двоичную переменную так, чтобы y это число успешных попыток, а ny - это число неудач.

Я уже использовал функцию rep(), чтобы получить правильные значения для L и Group на основе числа n:

litter2 = rep(litter,n)
group2 = rep(group,n)

Я попытался сделать то же самое, используя для l oop здесь:

for (i in 1:58) {
y2[i] = rep(c(1,0),c(df[i,4],(df$n[i]-df$y[i])))  
}

однако вместо получения вектора значений 607, сумма n с правильным числом успехов и неудач, Я получаю вектор с числом строк, равным числу, которое я установил в верхней части для l oop. С точки зрения моего мыслительного процесса я предположил, что, используя для l oop, я бы сделал повторение для каждого значения n и y. Так, например, в первом ряду он даст мне набор 1 1 и 9 0 в этом порядке.

Litter2 group2 y2  
1        1    1
1        1    0
1        1    0
1        1    0
1        1    0
1        1    0
1        1    0
1        1    0
1        1    0
1        1    0
...

Затем он должен перейти к следующим строкам, выполняя те же вычисления, пока у меня не будет единого вектора со всеми вычисленными значениями. Очевидно, я делаю что-то не так, чтобы не получить ожидаемый результат. это имеет отношение к тому, чему я равняю уравнение, y2 [i]?

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Мы можем использовать uncount, чтобы повторять строки на основе n и назначать y значения по сравнению с row_number() в каждом litter.

library(dplyr)

df %>%
  tidyr::uncount(n, .remove = FALSE) %>%
  group_by(litter) %>%
  mutate(y = +(row_number() <= y))

#   litter group     n     y
#    <dbl> <dbl> <dbl> <int>
# 1      1     1    10     1
# 2      1     1    10     0
# 3      1     1    10     0
# 4      1     1    10     0
# 5      1     1    10     0
# 6      1     1    10     0
# 7      1     1    10     0
# 8      1     1    10     0
# 9      1     1    10     0
#10      1     1    10     0
# … with 597 more rows
1 голос
/ 27 апреля 2020

tidyr имеет отличную функцию для этого.

df$litter2 <- mapply(rep, df$litter, df$n)
df$group2 <- mapply(rep, df$group, df$n)
df$trial <- mapply(function(n, y){c(rep(1, y), rep(0, n - y))}, 
                   df$n, df$y)
df <- tidyr::unnest(df, cols = c(litter2, group2, trial))
...