使用另一个矩阵条件创建数据

时间:2014-03-16 06:37:34

标签: arrays r matrix conditional apply

我知道必须有一个应用函数或ave,但我不太清楚如何做到这一点:

我有数据:

     date player market 
 1:  1-1      1      1    
 2:  1-1      2      1    
 3:  1-1      1      2    
 4:  1-2      2      1    
 5:  1-2      3      2    
 6:  1-3     21      1    
 7:  1-4      1      1    
 8:  1-4     51      1    
 9:  1-4      1      1    
10:  1-5      1      2    

我还有一个空白数组,它在行上有独特的日期,列上的独特市场和第三维的独特玩家。

1
[,,1]
    1  2
1-1
1-2
1-3
1-4
1-5


2
[,,2]
      1  2
1-1
1-2
1-3
1-4
1-5


etc

我想从数据中填写数组。 我希望每个点= 1,如果这个人在数据中有一个条目,他有一个日期和市场组合,如果没有,则为0。例如,对于1和2,它们将填写为:

1
[,,1]
    1  2
1-1 1 1
1-2 0 0
1-3 0 0
1-4 0 1
1-5 0 1


2
[,,2]
      1  2
1-1  1   0
1-2  1   0
1-3  0   0
1-4  0   0
1-5  0   0

循环是不可能的。谢谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您可以将xtabs用于此目的。临时日期,月份市场和日间玩家。

data(airquality)
tab<-xtabs(~Temp+Month+Day,airquality)

> dim(tab)
[1] 40  5 31


> str(tab)
 xtabs [1:40, 1:5, 1:31] 0 0 0 0 0 0 0 0 0 0 ...
 - attr(*, "dimnames")=List of 3
  ..$ Temp : chr [1:40] "56" "57" "58" "59" ...
  ..$ Month: chr [1:5] "5" "6" "7" "8" ...
  ..$ Day  : chr [1:31] "1" "2" "3" "4" ...
 - attr(*, "class")= chr [1:2] "xtabs" "table"
 - attr(*, "call")= language xtabs(formula = ~Temp + Month + Day, data = airquality)

编辑: 转换为数据框架。

> head(as.data.frame(tab))
  Temp Month Day Freq
1   56     5   1    0
2   57     5   1    0
3   58     5   1    0
4   59     5   1    0
5   61     5   1    0
6   62     5   1    0