2016-11-27 70 views
2

我做了這個簡單的數據幀,使我的問題更加清晰:匹配的ID

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'即用'(數據幀,煙[匹配(ID [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作爲數據框的索引將返回一個NA,而不是空值。這保留了序列信息。因此,您可以通過以下方式獲得配偶的所有吸菸值:

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

然後將這些值分配給數據框中的列。

> 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

我相信我找到了一個解決方案,但它是非常混亂(我是新來的R)

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