根据行名更改列中的值

时间:2017-10-27 18:00:57

标签: r excel vlookup

所以我有一个像这样的大文件:

ID     SNP    A1    A2
104    sr_1    A    G
104    sr_2    C    C
104    sr_3    C    A
105    sr_1    A    A
105    sr_2    C    G
105    sr_3    C    C
106    sr_1    A    A
106    sr_2    C    C
106    sr_3    C    C
.       .      .    .
.       .      .    .
.       .      .    .

我想做的是改变所有" G"在sr_1匹配的行中,按" A",这样如果任何sr_1行中的A2列中有G,则可以通过A更改。

以便结果如下:

ID     SNP    A1    A2
104    sr_1    A    A
104    sr_2    C    C
104    sr_3    C    A
105    sr_1    A    A
105    sr_2    C    G
105    sr_3    C    C
106    sr_1    A    A
106    sr_2    C    C
106    sr_3    C    C
.       .      .    .
.       .      .    .
.       .      .    .

我有很多行,sr_1不正确的A2值。我在excel / libreoffice中有一些VLOOKUP选项,有些函数在R中转换表格,但我找不到一个好的解决方案......

任何帮助?

5 个答案:

答案 0 :(得分:1)

如果您正在使用Excel,请在A2旁边的新列中尝试使用以下公式并填写:

=IF(AND(B2="sr_1",D2="G"),"A",D2)

如果SNP列为sr_1且A2列为G,则返回A,否则返回A2中的值。然后将填充的列值复制到A2列以更新

答案 1 :(得分:0)

在基础R中,您可以使用[的简单子集规则:

#subset A2 where snp is sr_1 and A2 is G/ Then replace A2 by A
df$A2[df$SNP == 'sr_1' & df$A2 == 'G'] <- 'A'
df
#   ID  SNP A1 A2
#1 104 sr_1  A  A
#2 104 sr_2  C  C
#3 104 sr_3  C  A
#4 105 sr_1  A  A
#5 105 sr_2  C  G
#6 105 sr_3  C  C
#7 106 sr_1  A  A
#8 106 sr_2  C  C
#9 106 sr_3  C  C

答案 2 :(得分:0)

您可以使用sqldf包并在sql中使用update,如下所示:

require(sqldf)
sql1 <- fn$identity("UPDATE df SET A2 = 'A' WHERE A2 = 'G' AND SNP = 'sr_1'")
sql2 <- "select * from df"
sqldf(c(sql1, sql2))

答案 3 :(得分:0)

在空行中尝试此公式,从第2行开始

=if(and(B2="sr_1",D2="G"),"A",D2)

复制下来。然后复制结果并粘贴到D列上的值

答案 4 :(得分:0)

你没有说明你想要如何表达这一点。是通过公式吗?或者通过宏代码?