我制作了这个简单的数据框,使我的问题更清晰:
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 :(得分: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