我正在尝试在两个数据帧之间匹配数据,但是正在获取向量中位置的值,而不是对应值。
我有两个data.frames:
df1=data.frame(Gene=c("gene1","gene2","gene3","gene4","gene5"),TWAS.testable=c(1,0,1,1,0),stringsAsFactors=FALSE)
> df1
Gene TWAS.testable
1 gene1 1
2 gene2 0
3 gene3 1
4 gene4 1
5 gene5 0
df2=data.frame(Gene=c("gene1","gene3","gene4","gene7","gene8"),TWAS.Z=c(0.43,3.63,0.11,-0.82,0.36),stringsAsFactors=FALSE)
> df2
Gene TWAS.Z
1 gene1 0.43
2 gene3 3.63
3 gene4 0.11
4 gene7 -0.82
5 gene8 0.36
我正在尝试将TWAS.testable中的值替换为与匹配的Gene对应的TWAS.Z中的值,否则用NA填充。所以我得到的是:
Gene TWAS.testable
1 gene1 0.43
2 gene2 NA
3 gene3 3.63
4 gene4 0.11
5 gene5 NA
所以我尝试了:
df1$TWAS.testable=ifelse(df1$Gene %in% df2$Gene,df2$TWAS.Z,NA)
返回
> df1
Gene TWAS.testable
1 gene1 0.43
2 gene2 NA
3 gene3 0.11
4 gene4 -0.82
5 gene5 NA
因此它将返回向量中的位置,而不是将TWAS.Z与相应的基因匹配。
即gene3是df1 $ Gene中的第三个对象,因此它将df2$TWAS.Z
中的第三个对象0.11填充TWAS.testable。实际上,我想要df2$TWAS.Z
在df1$Gene==df2$Gene
处。
我知道为什么会发生这种情况,但是我无法弄清楚如何在ifelse上下文中获得想要的东西,以便它在可能的情况下返回相应的TWAS.Z或用NA填充。
先谢谢了。
答案 0 :(得分:1)
您可以使用
match(df1$Gene,df2$Gene)
[1] 1 NA 2 3 NA
此向量告诉您每个df1 $ Gene df2 $ Gene中的对应位置。如果缺少,则返回NA
新数据框将是
data.frame(Gene=df1$Gene,
TWAS.testable=df2$TWAS.Z[match(df1$Gene,df2$Gene)])
Gene TWAS.testable
1 gene1 0.43
2 gene2 NA
3 gene3 3.63
4 gene4 0.11
5 gene5 NA
答案 1 :(得分:1)
您可以尝试
df1$TWAS.testable <- df2$TWAS.Z[match(df1$Gene,df2$Gene)]