首页 > 解决方案 > 避免在多列比较中使用嵌套循环

问题描述

我有一个这样的数据框:

df <- data.frame(Patient.ID = rep(paste("Pat", seq(1:3), sep = ""), 2),
             Gene = c(rep("Gene1", 3), rep("Gene2", 3)),
             Ref = c("A", "C", "G", "T", "A", "T"),
             Tum1 = c("A", "A", "T", "T", "A", "T"),
             Tum2 = c("A", "C", "G", "G", "C", "C"))

我想做的是确定 Ref 或任一 Tum 列之间发生的变化。换句话说,如果 Tum1 与 Tum2 不同,则取与 Ref 列不同的字符串并将其存储在单独的列中作为更改,因此上面的数据框将变为:

df <- data.frame(Patient.ID = rep(paste("Pat", seq(1:3), sep = ""), 2),
             Gene = c(rep("Gene1", 3), rep("Gene2", 3)),
             Ref = c("A", "C", "G", "T", "A", "T"),
             Tum1 = c("A", "A", "T", "T", "A", "T"),
             Tum2 = c("A", "C", "G", "G", "C", "C"),
             BaseChange = c("NoCh", "C.A", "G.T", "T.G", "A.C", "T.C"))

我知道我可以使用像下面这样的嵌套 ifelse() 语句(但扩展)来解决这个问题,但是我的实际数据框有更多组合,我认为必须有一个“更安全”的方法来这样做。

df$BaseChange <- as.factor(ifelse(df$Ref == "C" & df$Tum1 == "A" | df$Ref== "C" & df$Tum2 == "A", "C.A",
                              ifelse((df$Ref == "G" & df$Tum1 == "T" | df$Ref == "G" & df$Tum2 == "T"), "G.T",...)))

任何帮助将不胜感激。

标签: r

解决方案


它不漂亮,但它有效:

df <- df %>%
  mutate(BaseChange2 = ifelse( (as.character(Ref)==as.character(Tum1) & as.character(Ref) == as.character(Tum2)), "NoCh",
                                         ifelse(as.character(Ref)==as.character(Tum1),paste(Ref,Tum2, sep="."),paste(Ref,Tum1, sep="."))))

推荐阅读