Aşağıdakileri göz önünde bulundurun dt
:
dt <- data.table(a=c(1,1,2,3),b=c(4,5,6,4))
Böyle görünüyor :
> dt
a b
1: 1 4
2: 1 5
3: 2 6
4: 3 4
Burada her sütunu benzersiz değerlere göre topluyorum ve sonra her sütunun kaç tane uniquye değerine sahip olduğunu sayıyorum:
> dt[,lapply(.SD,function(agg) dt[,.N,by=agg])]
a.agg a.N b.agg b.N
1: 1 2 4 2
2: 2 1 5 1
3: 3 1 6 1
Böyle 1
iki kez görünür dt
ve böylece a.N
oluyor 2
aynı mantık diğer değerler için de geçerlidir.
Ancak sorun, orijinalin bu dönüşümleri ise datatable
sonunda farklı boyutlara sahip olun, işler geri dönüştürülecektir.
Örneğin bu dt
:
dt <- data.table(a=c(1,1,2,3,7),b=c(4,5,6,4,4))
> dt[,lapply(.SD,function(agg) dt[,.N,by=agg])]
a.agg a.N b.agg b.N
1: 1 2 4 3
2: 2 1 5 1
3: 3 1 6 1
4: 7 1 4 3
Warning message:
In as.data.table.list(jval, .named = NULL) :
Item 2 has 3 rows but longest item has 4; recycled with remainder.
Bu artık doğru cevap değil çünkü b.N
sadece şimdi olmalıydı. 3
satırlar ve şeyler (vektör) geri dönüştürüldü.
Bu yüzden ifadeyi dönüştürmek istiyorum dt[,lapply(.SD,function(agg) dt[,.N,by=agg])]
farklı boyutlara sahip bir listede, listedeki öğelerin adı yeni dönüştürülen sütunların adıdır dt
.
Ne demek istediğimin bir taslağı:
newlist
$a.agg
1 2 3 7
$a.N
2 1 1 1
$b.agg
4 5 6 4
$b.N
3 1 1
Ya da daha iyi bir çözüm elde etmek olurdu datatable
başka bir sütundaki sütunların iziyle:
dt_final
agg N column
1 2 a
2 1 a
3 1 a
7 1 a
4 3 b
5 1 b
6 1 b
measure.vars = colnames(d)
birkaç bin sütununuz varsa.