使用ifelse

时间:2019-11-27 15:21:15

标签: r if-statement

我正在尝试在两个数据帧之间匹配数据,但是正在获取向量中位置的值,而不是对应值。

我有两个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.Zdf1$Gene==df2$Gene处。

我知道为什么会发生这种情况,但是我无法弄清楚如何在ifelse上下文中获得想要的东西,以便它在可能的情况下返回相应的TWAS.Z或用NA填充。

先谢谢了。

2 个答案:

答案 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)]