基于两列的组合切换 R 中数据帧中的列值

use*_*782 4 r dataframe

我有一个关于根据基于两列的组合更改 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是 anAA2是 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但它不起作用。任何帮助,将不胜感激。谢谢

Pet*_*ter 5

如果我正确理解了这个问题,并假设您只有两封信需要处理,那么只有一种情况需要编辑;也就是说,字母顺序相反,即“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)