2016-11-27 2 views
2

Я сделал этот простой кадр данных, чтобы сделать мой вопрос более ясно:соответствие идентификатора внутри фрейма данных

id = c(11, 12, 13, 14, 15) 
referenceperson = c("yes", "no", "yes", "no", "yes") 
smoke = c(3, 4, 3, NA, 2) 
spouseid = c(12, 11, NA, 15, 14) 
dataframe = data.frame(id, referenceperson , smoke, spouseid) 

Я хотел бы получить сумму курения супруги только эталонный человека, в данном примере значение 4 первого наблюдения.

Я потерял здесь и спасибо за любую помощь

+0

Используйте '' match' т.е. с (dataframe, дыма [матча (ид [1], spouseid)]) # [1] 4' – akrun

ответ

2

Использование только значения в ваш dataframe объект, шагнет хотя он и представляет собой компактный метод получения одного значения вы просите, а затем все значения:

> dataframe[ match(dataframe$spouseid[1], data.frame$id) , 'smoke'] 
[1] 4 

Это был метод получения индекса супруг человека в первом и использовать его для получения значения «дыма» в указанной строке. Следующая строка показывает, что match доставит вам все такие индексы, и там, где они не существуют, будет возвращен NA.

> match(dataframe$spouseid, dataframe$id) 
[1] 2 1 NA 5 4 

В R используя NA в качестве индекса в dataframe возвратит NA, а не нулевое значение. Это сохраняет информацию о последовательности. Таким образом, вы можете получить все значения курительных супругов с этим:

> dataframe[ match(dataframe$spouseid, dataframe$id) , 'smoke'] 
[1] 4 3 NA 2 NA 

А затем присвоить эти значения столбца в dataframe.

> dataframe$smk_stat_spouse <- 
        dataframe[ match(dataframe$spouseid, dataframe$id) , 'smoke'] 
> dataframe 
    id referenceperson smoke spouseid smk_stat_spouse 
1 11    yes  3  12    4 
2 12    no  4  11    3 
3 13    yes  3  NA    NA 
4 14    no NA  15    2 
5 15    yes  2  14    NA 
+0

большое спасибо! –

0

Я считаю, я нашел решение, хотя это очень грязный (я новичок в г)

df1 <- cbind(id, referenceperson) 
df1 <- as.data.frame(df1) 

df2 <- cbind(spouseid, smoke) 
df2 <- as.data.frame(df2) 

matched <- df2$smoke[match(df1$id, df2$spouseid) ] 

refp <- ifelse(referenceperson=="yes", 1, referenceperson) 
refp <- ifelse(refp=="no", NA, refp) 
refp <- as.numeric(refp) 
refp*matched 
Смежные вопросы