r - 避免在多列比较中使用嵌套循环
问题描述
我有一个这样的数据框:
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",...)))
任何帮助将不胜感激。
解决方案
它不漂亮,但它有效:
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="."))))
推荐阅读
- c# - Azure EventHubs 抛出异常:端点的至少一个接收器是使用 '0' 的纪元创建的,因此不允许使用非纪元接收器
- python - Django 表单继承不从字段中读取值
- javascript - javascript 从一个对象数组拆分为 2 个匹配项和不匹配项的数组
- javascript - 上传时的arraybuffer最大大小
- excel - 如何使用 Excel 脚本将动态范围转换为表格?
- python - 计算文本列作为其他两列的 concat(字符串总和)
- safari - 在 target='_blank' 之后强制 Safari 关闭选项卡
- reactjs - ReactJS:如何将图像从前端上传到公共文件夹
- javascript - 未处理的拒绝(TypeError):在 REACT FETCH 中将循环结构转换为 JSON
- eslint - 如何使用 ESLint 配置 jsdoc 格式?