使用 for 循环将数据转换为 R 中的二进制变量

Using a for loop to pivot data into a binary variable in R

我有这个数据集:

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 是成功的次数,n-y 是失败的次数。

我已经使用 rep() 函数根据数字 n:

获得 L 和组的正确值
litter2 = rep(litter,n)
group2 = rep(group,n)

我在这里尝试使用 for 循环做同样的事情:

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

然而,我没有获得 607 个值的向量,即 n 的总和以及正确的成功次数和失败次数,而是得到一个行数等于我在顶部设置的数字的向量循环。就我的思维过程而言,我假设通过使用 for 循环我会对 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]?

有关系吗

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))

我们可以使用uncount重复基于n的行并分配y值与每个litter中的row_number()进行比较。

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