所以我有一个像这样的大文件:
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中转换表格,但我找不到一个好的解决方案......
任何帮助?
答案 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)
你没有说明你想要如何表达这一点。是通过公式吗?或者通过宏代码?