我有一个包含三列的表格(表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)
}
答案 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