2013-04-24 14 views
7

: Doğaldata.table ve masa beklenmedik davranış verileri ben etrafında oynuyordum başka bir soru geliyor

dt[user == 3, as.data.frame(table(country))] 
# country Freq 
#1  1 4 
#2  2 1 

dt[user == 4, as.data.frame(table(country))] 
# country Freq 
#1  2 5 

dt[, as.data.frame(table(country)), by = user] 
# user country Freq 
#1: 3  1 4 
#2: 3  2 1 
#3: 4  1 5 
#    ^^^ - why is this 1 instead of 2?! 

Teşekkür mnel ve Victor K.: Burada

dt <- data.table(user=c(rep(3, 5), rep(4, 5)), 
       country=c(rep(1,4),rep(2,6)), 
       event=1:10, key="user") 
# user country event 
#1:  3  1  1 
#2:  3  1  2 
#3:  3  1  3 
#4:  3  1  4 
#5:  3  2  5 
#6:  4  2  6 
#7:  4  2  7 
#8:  4  2  8 
#9:  4  2  9 
#10: 4  2 10 

Ve şaşırtıcı bir davranış takip-2 olmalı, yani bu bir hata mı? O beklenti yanlış mı

rbind(dt[user == 3, blah], dt[user == 4, blah]) 

özdeş sonuç döndürmek için

dt[, blah, by = user] 

beklenen?

+2

Ülkede as.data.frame konumunda (tablo (ülke)) bir faktör var mı? Eğer öyleyse bu, seviyelerin her ikisinde de aynı olmadığı içindir. – mnel

+1

@mnel, bunun içindeyken, 'as.data.frame' 'faktörü' için zorlamadan kaynaklanırken, beklenen davranış, etiketi temsil edecek değerdir. Sanırım bu muhtemelen "rbindlist" ile aynı şey oluyor: http://stackoverflow.com/questions/15933846/rbindlist-two-data-tables-where-one-has-factor-and-other-has- karakter-tipi-için/15935715 # 15935715 –

+0

@eddi, cevabımı güncellemeye bakın. –

cevap

5

mnel yorumlarında belirtildiği gibi, as.data.frame(table(...)), ilk değişkenin bir faktör olduğu bir veri çerçevesi oluşturur. user == 4 için, 1.

, dahili şekilde faktörü, sadece bir seviye Ne istiyorsun faktörüne seviyeleri olduğunu, ama ne olsun (1'den başlayarak tam olarak) faktörler içten depolandığı nasıl var .

> dt[, lapply(as.data.frame(table(country)), as.character), by = user] 
    user country Freq 
1: 3  1 4 
2: 3  2 1 
3: 4  2 5 

Güncelleme: Aşağıdaki beklenen sonuç ortaya koymaktadır. İkinci sorunuzla ilgili olarak: Hayır, bence data.table davranışı doğru.

> a <- factor(3:5) 
> b <- factor(6:8) 
> a 
[1] 3 4 5 
Levels: 3 4 5 
> b 
[1] 6 7 8 
Levels: 6 7 8 
> c(a,b) 
[1] 1 2 3 1 2 3 
+1

Bir ilgi olarak dt [, lapply (as.data.frame.table (ülke)), as.character), by = kullanıcı] 'bir hata verir –

+1

Ama bu muhtemelen' data.table' ile ilgisi yoktur: örn. 'as.data.frame.table (dt $ ülke) 'aynı hatayı üretir –

+0

Bu iyi bir nokta –

7

deyimsel data.table yaklaşım çok daha hızlı olacaktır .N

dt[ , .N, by = list(user, country)] 

Bu kullanmaktır ve aynı zamanda koruyacaktır: Aynı şey farklı seviyeleri ile iki etmeni katılırken düz Ar olur Orijinal olarak aynı sınıf olarak ülke.

+0

güzel bir, teşekkürler – eddi

İlgili konular