如何基于文本文件两列生成新列?附R代码排障请求
修复R代码生成
splicing列的问题 先明确你的需求:给包含exons和affected_exon列的数据集新增splicing列,规则如下:
- 当
affected_exon = 1时赋值为first - 当
affected_exon = exons时赋值为last - 当
1 < affected_exon < exons时赋值为middle
你的现有代码没达到预期,问题主要出在这几个地方:
1. 循环逻辑完全错误
你写的for (i in out)是在遍历数据框的列,而不是逐行处理数据,这和你需要逐行判断的需求完全不匹配。应该遍历数据框的行索引,比如for (i in 1:nrow(out))。
2. 变量赋值方式错误
你用cluster <- c("last")这种写法,每次循环都会把整个cluster变量替换成单个字符串,而不是给对应行的位置赋值。而且原数据里根本没有group列,cluster <- out$group这行完全是多余的,应该直接操作新的splicing列。
3. 未针对单行数据做判断
你的条件scans == exon是对整个向量做比较,不是针对第i行的exons和affected_exon值,这样根本无法实现逐行的逻辑判断。
修正后的Base R代码(循环版本)
# 读取数据 out <- read.delim("out.txt", sep = "\t", header = TRUE) # 初始化splicing列,先设为默认值 out$splicing <- NA # 逐行遍历判断 for (i in 1:nrow(out)) { exons_val <- out$exons[i] affected_val <- out$affected_exon[i] if (affected_val == 1) { out$splicing[i] <- "first" } else if (affected_val == exons_val) { out$splicing[i] <- "last" } else if (affected_val > 1 && affected_val < exons_val) { out$splicing[i] <- "middle" } } # 查看结果 print(out)
更高效的向量化实现(推荐)
在R里尽量避免循环,用向量化操作更简洁高效,这里提供两种常用方式:
方法1:Base R嵌套ifelse
out <- read.delim("out.txt", sep = "\t", header = TRUE) out$splicing <- ifelse(out$affected_exon == 1, "first", ifelse(out$affected_exon == out$exons, "last", ifelse(out$affected_exon > 1 & out$affected_exon < out$exons, "middle", NA)))
方法2:dplyr包(逻辑更清晰)
如果你已经安装了dplyr包,用case_when写出来的逻辑可读性更强:
library(dplyr) out <- read.delim("out.txt", sep = "\t", header = TRUE) %>% mutate(splicing = case_when( affected_exon == 1 ~ "first", affected_exon == exons ~ "last", between(affected_exon, 2, exons - 1) ~ "middle", TRUE ~ NA_character_ # 处理其他异常情况 ))
运行以上任意一种方法,都会得到你预期的结果:
exons affected_exon splicing 1 24 22 middle 2 37 7 middle 3 14 14 last 4 33 1 first
内容的提问来源于stack exchange,提问作者Mia Lua
相关产品推荐
相关产品推荐

