从矩阵到3D阵列

时间:2018-04-23 15:37:11

标签: r data.table

我有一个包含三列的表格(表1):

class form1(forms.ModelForm):
    CHOICES = (('EASY', 'EASY'), ('MEDIUM', 'MEDIUM'), ('HARD', 'HARD'))
    dificulty = forms.ChoiceField(choices=CHOICES)
    xp = forms.IntegerField()

对于每个id,我有4个时间点的功能1和功能2.从这个表我想建立一个3D数组[ID数量,4(时间步长),2(功能数量)]。为此,我有以下代码:

id feature1 feature2
1   0.5       0.7
1   0.52      0.72
1   0.5       0.7
1   0.3       0.7
21  0.5       0.3
21  0.5       0.3
21  0.5       0.3
21  0.5       0.3

ids是一个包含' ids'的唯一值的表格。表1这个代码非常慢,我怎么能得到相同的结果但速度更快?

我期待以下解决方案:

trainData <- array(numeric(),c(0,4,2))
for(patient in 1:dim(ids)[1]  ){
  trainData<-abind(trainData,TABLE1[id==ids[patient],-c('id')],along=1)
}

1 个答案:

答案 0 :(得分:3)

假设您想继续使用 abind 包,您可以这样做:

, , 1

  feature1 feature2
5     0.50     0.70
6     0.52     0.72
7     0.50     0.70
8     0.30     0.70

, , 21

  feature1 feature2
5      0.5      0.3
6      0.5      0.3
7      0.5      0.3
8      0.5      0.3

这会生成一个带有方便标注尺寸的数字数组,不需要循环:

TABLE1

如果split是data.table,@ Blaza指出可以使用data.table的abind方法为feature.list <- split(TABLE1, by = "id", keep.by = FALSE) 准备数据框:

aperm

最后,要生成所需的形状,可以使用feature.array <- aperm(feature.array, c(3,1,2)) , , feature1 5 6 7 8 1 0.5 0.52 0.5 0.3 21 0.5 0.50 0.5 0.5 , , feature2 5 6 7 8 1 0.7 0.72 0.7 0.7 21 0.3 0.30 0.3 0.3

SELECT ISNULL(NULLIF(LTRIM(RTRIM(column_name)), ''), 'Display Text')
FROM TableName