如何在 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