如何从R中的for循环填充矩阵

如何从R中的for循环填充矩阵,r,for-loop,R,For Loop,当我尝试使用下面编写的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

当我尝试使用下面编写的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级别中获得每年的条目


任何评论都会有帮助

这里不需要使用循环。您只需按
年份
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

您也可以使用
dplyr
来执行此操作。
dplyr
解决方案如下:

dat %>% 
   group_by(Year, k3) %>%
   summarize(N=n())

我不知道你想做什么,但正如休伯特说的。填充
Year时,
j
索引的值应该是一个整数。矩阵
应该是
1..2..3..
这样的值,因为您已经做了
(j在1990:2014)
它将给出
j
值,如
1990..1991..1992..2014
要修复此偏移,请按如下所示修改
索引。您的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
    }
}

年。矩阵[j,i]
j是一个指数,应该是一个介于1和25之间的整数,而不是在1990年到2014年。谢谢大家快速、有用的回答。各位,我将与你们的建议一起工作!