使用 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
我有这个数据集:
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:
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