2015-07-01 3 views
6

У меня есть большой стол с 50000 общ. Нижеследующее отражает структуру:Как найти недостающие ID?

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) 

В случае отсутствия некоторых значений вектора "a". Тем не менее, у меня есть некоторые таблицы, где ID и недостающие строки включены:

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) 

Есть ли способ включить недостающие строки из ключа в столбец А, используя идентификатор?

ответ

2

Другими вариантов заключаются в использовании data.table сек быстрого двоичного присоединиться и обновления ссылочной capabilit х годов

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 

Если вы хотите заменить только в NA с (не все соединяемые случаев), немного сложнее implemintation будет

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

Hallo David, спасибо, что показал оба способа. Я знаю, что его трудно объяснить, не показывая исходные данные, но оба ваших пути проходили без ошибок и без замены 'NA' –

+0

У вас есть реальный' NA 'или просто символ' 'NA ''? В любом случае, первый метод должен работать в любом случае. Также возможно, что ни один случай в 'key' не соответствует' df'. –

0

Названные векторы делают хорошие справочные таблицы:

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

поиска теперь именованный вектор, вы можете получить доступ к каждому значению по перекодировки [ID], например, Lookup [ "2"] (убедитесь, что номер является символом, а не числовой)

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

матча, кажется, быстрее на больших векторов /data.frames. –

+0

Я думаю, что этот способ более читабельен, чем матч, но да скорость, вероятно, важна для больших кадров. – MarkeD

1

Вы можете просто использовать match; однако я бы рекомендовал, чтобы оба ваших набора данных использовали character s вместо factor s для предотвращения головных болей позже.

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 

Конечно, вы можете всегда придерживаться factor с и фактором всего столбца «ID» и используйте ярлыки для замены значений в колонке «а» ....

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 

Присвоить что df$a и вы сделали ....

+0

Привет, спасибо за предложение. Следуя вашим советам, я просто беру на свои исходные данные вектор как результат с длиной моей 'NA', смешанной с записями, и' NA' –

Смежные вопросы