2015-07-01 14 views
6

50000 obs ile büyük bir tablom var. Aşağıdaki mimik yapısı: vektör "a" bazı eksik değerler vardırEksik kimlikler nasıl eşleştirilir?

ID <- c(1,2,3,4,5,6,7,8,9) 
a <- c("A","B",NA,"D","E",NA,"G","H","I") 
b <- c(11,2233,12,2,22,13,23,23,100) 
c <- c(12,10,12,23,16,17,7,9,7) 
df <- data.frame(ID ,a,b,c) 

.

ID <- c(1,2,3,4,5,6,7,8,9) 
a <- c("A","B","C","D","E","F","G","H","I") 

key <- data.frame(ID,a) 

kimliğini kullanarak bir sütuna anahtarından eksik dizeleri dahil etmek bir yolu var mı: Ancak, ben kimliği ve eksik dizeleri içerdiği bazı tablolar var?

lookup <- a 
names(lookup) <- as.character(ID) 

arama hemen adlandırılmış vektör, arama [ID] tarafından her birine erişmek için örn:

cevap

2

başka seçenekler data.table s hızla ikili kullanmaktır katılmak ve referans capabilit tarafından güncelleme Eğer daha karmaşık implemintation olacak sadeceNA s (değil tüm katıldı vakalar), biraz değiştirmek istiyorsanız ler

library(data.table) 
setkey(setDT(df), ID)[key, a := i.a] 
df 
# ID a b c 
# 1: 1 A 11 12 
# 2: 2 B 2233 10 
# 3: 3 C 12 12 
# 4: 4 D 2 23 
# 5: 5 E 22 16 
# 6: 6 F 13 17 
# 7: 7 G 23 7 
# 8: 8 H 23 9 
# 9: 9 I 100 7 

setkey(setDT(key), ID) 
setkey(setDT(df), ID)[is.na(a), a := key[.SD, a]] 
+0

Hallo David, her iki yolu da gösterdiğiniz için teşekkür ederim. Orijinal verileri göstermeden açıklamak zor olduğunu biliyorum, ancak her iki yol da hatasız ve "NA" –

+0

yerine geçiyordu Gerçek NA'larınız var mı yoksa sadece "NA" karakterini mi? Her iki durumda da, ilk yöntem her durumda çalışmalıdır. Ayrıca "anahtar" da hiçbir durumun "df" ile eşleşmemesi de mümkündür. –

0

adlandırılmış vektörler güzel arama tabloları yapmak arama [ "2"] sadece match kullanabilirsiniz

## should give you a vector of a as required. 
lookup[as.character(ID_from_big_table)] 
+0

Maç hızlı büyük vektörlere gibi görünüyor /data.frames. –

+0

Bu yolun eşleşmeden daha okunabilir olduğunu düşünüyorum, ancak büyük kareler için evet hızı muhtemelen önemli. – MarkeD

1

(sayı sayısal bir karakter, olmadığından emin olun); Ancak, her iki veri kümesinin daha sonra baş ağrısını önlemek için factor s yerine character s kullanmasını tavsiye ederim. Tabii

key$a <- as.character(key$a) 
df$a <- as.character(df$a) 

df$a[is.na(df$a)] <- key$a[match(df$ID[is.na(df$a)], key$ID)] 
df 
# ID a b c 
# 1 1 A 11 12 
# 2 2 B 2233 10 
# 3 3 C 12 12 
# 4 4 D 2 23 
# 5 5 E 22 16 
# 6 6 F 13 17 
# 7 7 G 23 7 
# 8 8 H 23 9 
# 9 9 I 100 7 

, her zaman factor s sopa ve tüm "Kimlik" sütunu faktör ve sütun "a" değerleri değiştirmek için etiketleri kullanabilirsiniz ....

factor(df$ID, levels = key$ID, labels = key$a) 
## [1] A B C D E F G H I 
## Levels: A B C D E F G H I 

Ata Buna df$a ve bitirdiniz ....

+0

Merhaba, öneri için teşekkür ederim. Tavsiyenizi takiben, orijinal verilerime, girişler ile karıştırılmış NA'mın uzunluğu ile bir vektör aldım ve 'NA' –

İlgili konular