根据行名更改列中的值

所以我有一个大文件看起来像这样:

ID SNP A1 A2 104 sr_1 AG 104 sr_2 CC 104 sr_3 CA 105 sr_1 AA 105 sr_2 CG 105 sr_3 CC 106 sr_1 AA 106 sr_2 CC 106 sr_3 CC . . . . . . . . . . . . 

我想要做的是将sr_1匹配行中的所有“G”都改为“A”,这样,如果在任何sr_1行中有A2列中的G,则可以通过A来更改它。

所以结果会是:

 ID SNP A1 A2 104 sr_1 AA 104 sr_2 CC 104 sr_3 CA 105 sr_1 AA 105 sr_2 CG 105 sr_3 CC 106 sr_1 AA 106 sr_2 CC 106 sr_3 CC . . . . . . . . . . . . 

我有许多行sr_1不正确的A2值。 我有一些在EXCEL / libreoffice VLOOKUP选项和一些函数转置在R表,但我找不到一个好的解决scheme…

任何帮助?

在基地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 AA #2 104 sr_2 CC #3 104 sr_3 CA #4 105 sr_1 AA #5 105 sr_2 CG #6 105 sr_3 CC #7 106 sr_1 AA #8 106 sr_2 CC #9 106 sr_3 CC 

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

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

如果SNP列是sr_1,A2列是G,则返回A,否则返回A2。 然后将填满的列值复制到A2列上进行更新

在第2行开始的空列中试试这个公式

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

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

你可以使用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)) 

你没有指定你想如何accmplush。 它是通过一个公式? 或者通过macros代码?