我不断发出一个超出范围的下标'当我尝试使用我在下面编写脚本的for循环填充矩阵时出错。我的数据是一个大型csv文件,看起来类似于以下虚拟数据集:
Sample k3 Year
1 B92028UUU 1 1990
2 B93001UUU 1 1993
3 B93005UUU 1 1993
4 B93006UUU 1 1993
5 B93010UUU 1 1993
6 B93011UUU 1 1994
7 B93022UUU 1 1994
8 B93035UUU 1 2014
9 B93036UUU 1 2014
10 B95015UUU 2 2013
11 B95016UUU 2 2013
12 B98027UUU 2 1990
13 B05005FUS 2 1990
14 B06006FIS 2 2001
15 B06010MUS 2 2001
16 B05023FUN 2 2001
17 B05024FUN 3 2001
18 B05025FIN 3 2001
19 B05034MMN 3 2002
20 B05037MMS 3 1996
21 B05041MUN 3 1996
22 B06047FUS 3 2007
23 B05048MUS 3 2000
24 B06059FUS 3 2000
25 B05063MUN 3 2000
我的脚本如下:
Year.Matrix = matrix(1:75,nrow=25,byrow=T)
colnames(Year.Matrix)=c("Group 1","Group 2","Group 3")
rownames(Year.Matrix)=1990:2014
for(i in 1:3){
x=subset(data2,k3==i)
for(j in 1990:2014){
y=subset(x,Year==j)
z=nrow(y)
Year.Matrix[j,i]=z
}
}
我不知道为什么我收到错误消息,但是从我收集的其他帖子中我发现当我尝试填充矩阵时出现问题,也许是因为我的每个k3级别都没有每年的条目?< / p>
任何评论都会有所帮助!
答案 0 :(得分:2)
这里不需要使用循环。您只需按year
和k3
列计算长度:
library(data.table)
setDT(dat)[,.N,"Year,k3"]
Year k3 N
1: 1990 1 1
2: 1993 1 4
3: 1994 1 2
4: 2014 1 2
5: 2013 2 2
6: 1990 2 2
7: 2001 2 3
8: 2001 3 2
9: 2002 3 1
10: 1996 3 2
11: 2007 3 1
12: 2000 3 3
答案 1 :(得分:1)
您也可以使用dplyr
执行此操作。 dplyr
解决方案如下:
dat %>%
group_by(Year, k3) %>%
summarize(N=n())
答案 2 :(得分:0)
不确定你要做什么但正如Hubert L所说。您j
索引的值应为整数,同时填充Year.Matrix
它应该是1..2..3..
之类的值,因为您已完成(j in 1990:2014)
它将j
值设为1990..1991..1992.....2014
{1}}
修正此偏移量row
索引,如下所示。你的for循环
for(i in 1:3){
print(i)
x=subset(data2,k3==i)
for(j in seq_along(1990:2014)){
print(j)
y=subset(x,Year==j)
z=nrow(y)
Year.Matrix[j,i]=z
}
}
继续使用print
语句调试您的函数。运行此循环将立即告诉您要将Year.Matrix[1990,1]
索引的数据,这将通过超出范围的异常。
通过将索引偏移为:
来修复此for循环for(i in 1:3){
print(i)
x=subset(data2,k3==i)
for(j in 1990:2014){
print(j)
y=subset(x,Year==j)
z=nrow(y)
Year.Matrix[1990-j+1,i]=z
}
}