说我有此数据帧:转换2栏数据帧到完整的二进制矩阵
id time
1 A 1
2 D 1
3 E 3
4 H 1
5 I 4
6 J 3
7 L 4
8 M 5
9 N 6
10 O 5
11 P 6
12 Q 7
13 R 7
14 S 2
15 T 6
16 U 8
17 V 4
18 W 2
我希望该转换成二进制矩阵具有8行和列18(IDS的数据帧的数目)。矩阵应该从全零开始。 '时间'中的值是指每列可以出现'1'的第一行(该字母的顺序指的是列的编号,所以这个例子A = 1,D = 2,H = 4等)。在列出现1后,它应该自动填充到第8行。
我想出了这个笨拙的代码,但它涉及到一个循环,我必须认为我错过了一个更多优雅的方案。
tmp1 <- unlist(tmp$time)
out <- matrix(0, nrow(tmp), 8)
for(i in 1:nrow(tmp)){ out[i,tmp1[i]]<-1}
out <- apply(out,1,cumsum)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18]
[1,] 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[2,] 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1
[3,] 1 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1
[4,] 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 1 1
[5,] 1 1 1 1 1 1 1 1 0 1 0 0 0 1 0 0 1 1
[6,] 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1
[7,] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1
[8,] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1