如何在 R 命令中使用迭代变量?
How to use an iterated variable in an R command?
如果我尝试执行 R 命令:
shapiro.test(subset(GoatMerged, id == 1)$goat_pos)
然后这工作正常,我得到了正确的结果。
如果我尝试对 R 中的命令使用循环结构,它不起作用:
for(i in 1:13)
{
shapiro.test(subset(GoatMerged, id == i)$goat_pos)
}
如果变量名有迭代组件,命令 paste0()
很有用。但是对于命令
for(i in 1:13)
{
placeholder <- paste0("id == ", i, "", sep="")
shapiro.test(subset(GoatMerged, placeholder)$goat_pos)
}
它不起作用。
要给出一个(非最小)代表,这里是数据:
> GoatMerged[,c(1,3)]
id goat_pos
1 1 33
2 1 102
3 1 55
4 1 42
5 1 50
6 1 50
7 1 42
8 1 28
9 1 46
10 1 28
11 1 44
12 1 29
13 1 NA
14 2 71
15 2 79
16 2 57
17 2 88
18 2 86
19 2 78
20 2 78
21 2 51
22 2 71
23 2 59
24 2 78
25 2 69
26 2 78
27 3 50
28 3 40
29 3 52
30 3 53
31 3 55
32 3 NA
33 3 46
34 3 54
35 3 60
36 3 55
37 3 58
38 3 56
39 3 48
40 4 61
41 4 62
42 4 61
43 4 61
44 4 61
45 4 24
46 4 44
47 4 19
48 4 61
49 4 81
50 4 81
51 4 18
52 4 81
53 5 22
54 5 6
55 5 0
56 5 7
57 5 9
58 5 53
59 5 5
60 5 8
61 5 20
62 5 44
63 5 3
64 5 8
65 5 1
66 6 48
67 6 27
68 6 64
69 6 52
70 6 52
71 6 69
72 6 52
73 6 34
74 6 46
75 6 54
76 6 54
77 6 33
78 6 4
79 7 4
80 7 2
81 7 4
82 7 2
83 7 3
84 7 5
85 7 NA
86 7 5
87 7 1
88 7 2
89 7 11
90 7 3
91 7 5
92 8 28
93 8 61
94 8 53
95 8 45
96 8 47
97 8 35
98 8 37
99 8 41
100 8 40
101 8 49
102 8 31
103 8 40
104 8 28
105 9 101
106 9 99
107 9 99
108 9 83
109 9 99
110 9 102
111 9 81
112 9 102
113 9 103
114 9 98
115 9 81
116 9 81
117 9 103
在 R 命令中放置迭代器 i
的正确语法是什么?
此操作 lapply()
是一个不错的选择。 lapply()
就像一个 for 循环,但会自动将结果存储在列表中。这是一个例子。
mydat <- data.frame(
x = runif(1000, -1, 1),
group = rep(1:10, each=100))
tests <- lapply(1:10, function(i)shapiro.test(subset(mydat, group == i)$x))
tests
# [[1]]
#
# Shapiro-Wilk normality test
#
# data: subset(mydat, group == i)$x
# W = 0.96821, p-value = 0.01616
#
#
# [[2]]
#
# Shapiro-Wilk normality test
#
# data: subset(mydat, group == i)$x
# W = 0.94198, p-value = 0.0002551
#
#
# [[3]]
#
# Shapiro-Wilk normality test
#
# data: subset(mydat, group == i)$x
# W = 0.95952, p-value = 0.003714
#
#
# [[4]]
#
# Shapiro-Wilk normality test
#
# data: subset(mydat, group == i)$x
# W = 0.96265, p-value = 0.006236
#
#
# [[5]]
#
# Shapiro-Wilk normality test
#
# data: subset(mydat, group == i)$x
# W = 0.9588, p-value = 0.003304
#
#
# [[6]]
#
# Shapiro-Wilk normality test
#
# data: subset(mydat, group == i)$x
# W = 0.95483, p-value = 0.001751
#
#
# [[7]]
#
# Shapiro-Wilk normality test
#
# data: subset(mydat, group == i)$x
# W = 0.96587, p-value = 0.01078
#
#
# [[8]]
#
# Shapiro-Wilk normality test
#
# data: subset(mydat, group == i)$x
# W = 0.95063, p-value = 0.0009135
#
#
# [[9]]
#
# Shapiro-Wilk normality test
#
# data: subset(mydat, group == i)$x
# W = 0.93526, p-value = 0.0001002
#
#
# [[10]]
#
# Shapiro-Wilk normality test
#
# data: subset(mydat, group == i)$x
# W = 0.93848, p-value = 0.0001559
或者,您可以使用 for
循环,但正如评论中所讨论的,您需要保存或打印结果。
tests <- vector(mode="list", length=10)
for(i in 1:10){
tests[[i]] <- shapiro.test(subset(mydat, group == i)$x)
}
那么 tests
列表的每个元素都是一个测试。
使用您的示例(id
列增加到 9),如果 GoatMerged
是一个 data.frame 对象
,您可以这样做
for(i in 1:9){
shapiro.test(GoatMerged[GoatMerged$id%in%i,"goat_pos"])
}
您也可以使用另一个答案中提到的lapply
如果我尝试执行 R 命令:
shapiro.test(subset(GoatMerged, id == 1)$goat_pos)
然后这工作正常,我得到了正确的结果。 如果我尝试对 R 中的命令使用循环结构,它不起作用:
for(i in 1:13)
{
shapiro.test(subset(GoatMerged, id == i)$goat_pos)
}
如果变量名有迭代组件,命令 paste0()
很有用。但是对于命令
for(i in 1:13)
{
placeholder <- paste0("id == ", i, "", sep="")
shapiro.test(subset(GoatMerged, placeholder)$goat_pos)
}
它不起作用。
要给出一个(非最小)代表,这里是数据:
> GoatMerged[,c(1,3)]
id goat_pos
1 1 33
2 1 102
3 1 55
4 1 42
5 1 50
6 1 50
7 1 42
8 1 28
9 1 46
10 1 28
11 1 44
12 1 29
13 1 NA
14 2 71
15 2 79
16 2 57
17 2 88
18 2 86
19 2 78
20 2 78
21 2 51
22 2 71
23 2 59
24 2 78
25 2 69
26 2 78
27 3 50
28 3 40
29 3 52
30 3 53
31 3 55
32 3 NA
33 3 46
34 3 54
35 3 60
36 3 55
37 3 58
38 3 56
39 3 48
40 4 61
41 4 62
42 4 61
43 4 61
44 4 61
45 4 24
46 4 44
47 4 19
48 4 61
49 4 81
50 4 81
51 4 18
52 4 81
53 5 22
54 5 6
55 5 0
56 5 7
57 5 9
58 5 53
59 5 5
60 5 8
61 5 20
62 5 44
63 5 3
64 5 8
65 5 1
66 6 48
67 6 27
68 6 64
69 6 52
70 6 52
71 6 69
72 6 52
73 6 34
74 6 46
75 6 54
76 6 54
77 6 33
78 6 4
79 7 4
80 7 2
81 7 4
82 7 2
83 7 3
84 7 5
85 7 NA
86 7 5
87 7 1
88 7 2
89 7 11
90 7 3
91 7 5
92 8 28
93 8 61
94 8 53
95 8 45
96 8 47
97 8 35
98 8 37
99 8 41
100 8 40
101 8 49
102 8 31
103 8 40
104 8 28
105 9 101
106 9 99
107 9 99
108 9 83
109 9 99
110 9 102
111 9 81
112 9 102
113 9 103
114 9 98
115 9 81
116 9 81
117 9 103
在 R 命令中放置迭代器 i
的正确语法是什么?
此操作 lapply()
是一个不错的选择。 lapply()
就像一个 for 循环,但会自动将结果存储在列表中。这是一个例子。
mydat <- data.frame(
x = runif(1000, -1, 1),
group = rep(1:10, each=100))
tests <- lapply(1:10, function(i)shapiro.test(subset(mydat, group == i)$x))
tests
# [[1]]
#
# Shapiro-Wilk normality test
#
# data: subset(mydat, group == i)$x
# W = 0.96821, p-value = 0.01616
#
#
# [[2]]
#
# Shapiro-Wilk normality test
#
# data: subset(mydat, group == i)$x
# W = 0.94198, p-value = 0.0002551
#
#
# [[3]]
#
# Shapiro-Wilk normality test
#
# data: subset(mydat, group == i)$x
# W = 0.95952, p-value = 0.003714
#
#
# [[4]]
#
# Shapiro-Wilk normality test
#
# data: subset(mydat, group == i)$x
# W = 0.96265, p-value = 0.006236
#
#
# [[5]]
#
# Shapiro-Wilk normality test
#
# data: subset(mydat, group == i)$x
# W = 0.9588, p-value = 0.003304
#
#
# [[6]]
#
# Shapiro-Wilk normality test
#
# data: subset(mydat, group == i)$x
# W = 0.95483, p-value = 0.001751
#
#
# [[7]]
#
# Shapiro-Wilk normality test
#
# data: subset(mydat, group == i)$x
# W = 0.96587, p-value = 0.01078
#
#
# [[8]]
#
# Shapiro-Wilk normality test
#
# data: subset(mydat, group == i)$x
# W = 0.95063, p-value = 0.0009135
#
#
# [[9]]
#
# Shapiro-Wilk normality test
#
# data: subset(mydat, group == i)$x
# W = 0.93526, p-value = 0.0001002
#
#
# [[10]]
#
# Shapiro-Wilk normality test
#
# data: subset(mydat, group == i)$x
# W = 0.93848, p-value = 0.0001559
或者,您可以使用 for
循环,但正如评论中所讨论的,您需要保存或打印结果。
tests <- vector(mode="list", length=10)
for(i in 1:10){
tests[[i]] <- shapiro.test(subset(mydat, group == i)$x)
}
那么 tests
列表的每个元素都是一个测试。
使用您的示例(id
列增加到 9),如果 GoatMerged
是一个 data.frame 对象
for(i in 1:9){
shapiro.test(GoatMerged[GoatMerged$id%in%i,"goat_pos"])
}
您也可以使用另一个答案中提到的lapply