2015-03-02 11 views
5

İki sütunun benzersiz kombinasyonlarını yazdırmaya çalışırken, dplyr tbl_df dosyasındaki değerler üzerinde döngü yapıyorum. Deneme ve hatadan sonra tbl_df'yi standart bir data.frame'e dönüştürerek sadece istenen çıktıyı elde edebildim. İki yapı arasındaki temel farkların farkındayım ama hala her biriyle gördüğüm farklı çıktıyı anlayamıyorum. Bu verileritbl_df ve döngüler kullanırken data.frame farkı

hospital <- rep(c("Hospital 1", "Hospital 2", "Hospital 3"), 3) 
ward <- LETTERS[1:2] 
hospitals <- data.frame(cbind(hospital, ward)) 
hospitals[order(hospitals$hospital, hospitals$ward), ] 

#  hospital ward 
# 1 Hospital 1 A 
# 7 Hospital 1 A 
# 4 Hospital 1 B 
# 5 Hospital 2 A 
# 2 Hospital 2 B 
# 8 Hospital 2 B 
# 3 Hospital 3 A 
# 9 Hospital 3 A 
# 6 Hospital 3 B 

ve aşağıdaki döngü kullanarak Örneğin

,

for(hosp in unique(hospitals$hospital)){ 
    for(wa in unique(hospitals[hospitals$hospital==hosp, "ward"])){ 
    print(paste(hosp, wa, sep=" ")) 
    } 
    } 

benim istenen çıkış

#[1] "Hospital 1 A" 
#[1] "Hospital 1 B" 
#[1] "Hospital 2 B" 
#[1] "Hospital 2 A" 
#[1] "Hospital 3 A" 
#[1] "Hospital 3 B" 

olsun Ama aynı veri I bir tbl_df kullanarak yapabilirsiniz Farklı bir çıkış olsun

hospitals2 <- tbl_df(hospitals) 

for(hosp in unique(hospitals2$hospital)){ 
    for(wa in unique(hospitals2[hospitals2$hospital==hosp, "ward"])){ 
    print(paste(hosp, wa, sep=" ")) 
    } 
    } 


#[1] "Hospital 1 A" "Hospital 1 B" 
#[1] "Hospital 2 B" "Hospital 2 A" 
#[1] "Hospital 3 A" "Hospital 3 B" 

Sadece bir yazdırma farkı değil, bu, altı tek elemanlı vektör yerine üç adet iki elemanlı vektör gibi görünüyor ve sonraki kodum, normal bir veri çerçevesinde döngü çalıştırdığımda beklendiği gibi çalışıyor.

Neden bu farklılıkları görebiliyorum açıklayabilir miyim?

cevap

6

tbl_df üzerinde for loop yapamazsınız, [. Belgeler zaten her şeyi söylüyor:

[ Hiçbir zaman (damla) basitleştiren, bu nedenle her zaman data.frame döndürür.

için, örneğin bir kolon vektörü elde etmek için

hospitals2[hospitals2$hospital==hosp, "ward"] 
#Source: local data frame [3 x 1] 

# ward 
#1 A 
#2 B 
#3 A 

hospitals[hospitals$hospital==hosp, "ward"] 
#[1] A B A 
#Levels: A B 

Kullanım [[ ise hospitals2[hospitals2$hospital==hosp, "ward"] döner data.frame,

for(hosp in unique(hospitals2$hospital)){ 
    for(wa in unique(hospitals[hospitals$hospital==hosp,][["ward"]])){ 
     print(paste(hosp, wa, sep=" ")) 
    } 
} 
#[1] "Hospital 1 A" 
#[1] "Hospital 1 B" 
#[1] "Hospital 2 B" 
#[1] "Hospital 2 A" 
#[1] "Hospital 3 A" 
#[1] "Hospital 3 B" 
+2

diğer kanıtı ekleyerek olduğunu görüyoruz ' düşürmek = FALSE 'ilk döngüye,' tbl_df' nesnesindekiyle aynı davranışı alırsınız. (için benzersiz (hastaneler [hastaneler $ hastane = hastane, ”koğuş, damla = YANLIŞ)]) {' –

+0

@ RomanLuštrik Ek açıklama için teşekkür ederiz. – Khashaa

+0

Çok teşekkürler @Khashaa, Dokümantasyonda okumuştum ama alaka düzeyini tamamen gözden kaçırdım. –