在数据框内匹配id

时间:2016-11-27 16:59:30

标签: r indexing matching

我制作了这个简单的数据框,使我的问题更清晰:

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。

我迷失在这里并感谢您的帮助

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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