2014-11-15 3 views
-2

У меня есть два кадра данных. 1 полная информация о лицах, включая их название улицы и номер дома, но не размер их дома. И еще одна информация о каждом доме, включая название улицы, номер дома и размер дома, но не данные о лицах, живущих в этом доме. Я хотел бы добавить информацию о размере в первый фрейм данных как новый столбец, чтобы я мог видеть размер дома для каждого человека.R - Поиск определенной строки фрейма данных, а затем добавление данных из этой строки в другой фрейм данных

У меня более 200 000 человек и около 100 000 домов и методы, которые я пробовал до сих пор (сокращение второго кадра данных для каждого человека), являются болезненно медленными. Является ли их эффективным способом сделать это? Спасибо.

+1

Вам просто нужно 'merge' два dataframes. Более конкретные рекомендации требуют [воспроизводимого примера] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). – Thomas

ответ

1

Вот мое предложение. Учитывая то, что вы описали в своих данных, я создал образец данных. Однако попробуйте предоставить образцы данных в следующий раз. Когда вы предоставляете образцы данных и ваш код, вы, скорее всего, получите помощь и позвольте людям сэкономить больше времени. У вас есть две ключевые переменные для объединения двух фреймов данных: названия улиц и номера дома. Здесь я решил сохранить все точки данных в df1.

df1 <- data.frame(person = c("ana", "bob", "cathy", "dan", "ellen"), 
        street = c("makiki st", "liliha st", "nuuanu ave", "mahalo st", "nehoa st"), 
        num = c(15, 3, 8, 32, 11), 
        stringsAsFactors = FALSE) 

    #person  street num 
#1 ana makiki st 15 
#2 bob liliha st 3 
#3 cathy nuuanu ave 8 
#4 dan mahalo st 32 
#5 ellen nehoa st 11 

df2 <- data.frame(size = c("small", "large", "medium"), 
        street = c("makiki st", "liliha st", "nuuanu ave"), 
        num = c(15, 3, 8), 
        stringsAsFactors = FALSE) 

# size  street num 
#1 small makiki st 15 
#2 large liliha st 3 
#3 medium nuuanu ave 8 

library(dplyr) 

left_join(df1, df2) 

#  street num person size 
#1 makiki st 15 ana small 
#2 liliha st 3 bob large 
#3 nuuanu ave 8 cathy medium 
#4 mahalo st 32 dan <NA> 
#5 nehoa st 11 ellen <NA> 
2

Использование @ Например jazzurro другой вариант для больших наборов данных будет использовать data.table

library(data.table) 
setkey(setDT(df1), street, num) 
setkey(setDT(df2), street, num) 
df2[df1] 
#  size  street num person 
#1: large liliha st 3 bob 
#2:  NA mahalo st 32 dan 
#3: small makiki st 15 ana 
#4:  NA nehoa st 11 ellen 
#5: medium nuuanu ave 8 cathy