我有一个关于根据基于两列的组合更改 data.frame 中的字符值的问题。我将尝试举一个例子来说明 data.frame 的外观
data <- data.frame(A1 = c("A", "T", "C"), A2 = c("C", "G", "T"),
Ind1 = c("AA", "TG", "TT"), Ind2 = c("CA", "GT", "CT"),
Ind3 = c("AC", "GG", "TC"))
> data
A1 A2 Ind1 Ind2 Ind3
1 A C AA CA AC
2 T G TG GT GG
3 C T TT CT TC
Run Code Online (Sandbox Code Playgroud)
A1我想更改从 Ind1 到 Ind3 的列中的值,这些值与列和的可能组合不匹配A2,例如在第一行中,A1是 anA和A2是 a ,C因此可能的组合将是AA, AC, CC(基于A1, 和 的组合A2以该顺序)。因此 Ind2 应该AC代替CA。
所需的输出将是这样的:
> data
A1 A2 Ind1 Ind2 Ind3
1 A C AA AC AC
2 T G TG TG GG
3 C T TT CT CT
Run Code Online (Sandbox Code Playgroud)
我已经尝试过,switch但它不起作用。任何帮助,将不胜感激。谢谢
如果我正确理解了这个问题,并假设您只有两封信需要处理,那么只有一种情况需要编辑;也就是说,字母顺序相反,即“A2A1”。所有其他情况都是正确的。所以你可以通过一个简单的ifelse变异来管理这个问题。
data <- data.frame(A1 = c("A", "T", "C"), A2 = c("C", "G", "T"),
Ind1 = c("AA", "TG", "TT"), Ind2 = c("CA", "GT", "CT"),
Ind3 = c("AC", "GG", "TC"))
library(dplyr)
data |>
mutate(across(starts_with("Ind"), ~ ifelse(.x == paste0(A2, A1), paste0(A1, A2), .x)))
#> A1 A2 Ind1 Ind2 Ind3
#> 1 A C AA AC AC
#> 2 T G TG TG GG
#> 3 C T TT CT CT
Run Code Online (Sandbox Code Playgroud)
为了回应OP评论,使用“真实”数据:
df2 <- structure(list(chr = "chr11", pos = "74565122", snp_id = "chr11_74565122_C_T_b38", Allele1 = "C", Allele2 = "T", GTEX_111CU = "TT", GTEX_111YS = "CT", GTEX_1122O = "TC", GTEX_117XS = "TC", GTEX_117YX = "TC"), class = "data.frame", row.names = c(NA, -1L))
df2
#> chr pos snp_id Allele1 Allele2 GTEX_111CU GTEX_111YS
#> 1 chr11 74565122 chr11_74565122_C_T_b38 C T TT CT
#> GTEX_1122O GTEX_117XS GTEX_117YX
#> 1 TC TC TC
mutate(df2, across(starts_with("GTEX"), ~ ifelse(.x %in% paste0(Allele2, Allele1), paste0(Allele1, Allele2), .x)))
#> chr pos snp_id Allele1 Allele2 GTEX_111CU GTEX_111YS
#> 1 chr11 74565122 chr11_74565122_C_T_b38 C T TT CT
#> GTEX_1122O GTEX_117XS GTEX_117YX
#> 1 CT CT CT
Run Code Online (Sandbox Code Playgroud)