【问题标题】:How to build data matrix from mixed and messy CSV file?如何从杂乱无章的 CSV 文件中构建数据矩阵?
【发布时间】:2014-02-09 00:49:00
【问题描述】:

我有一个像这样的巨大的.csv 文件:

Transcript Id   Gene Id(name)   Mirna Name  miTG score
ENST00000286800 ENSG00000156273 (BACH1) hsa-let-7a-5p   1
UTR3    21:30717114-30717142    0.05994568  
UTR3    21:30717414-30717442    0.13591267  
ENST00000345080 ENSG00000187772 (LIN28B)    hsa-let-7a-5p   1
UTR3    6:105526681-105526709   0.133514751 

我想从中构建一个这样的矩阵:

Transcript Id    Gene Id(name)   Mirna Name        miTG score    UTR3        MRE_score   
ENST00000286800 ENSG00000156273 (BACH1) hsa-let-7a-5p       1  21:30717414-30717442 0.13591267  

我想在我的新矩阵中添加三个新列,名为UTR3MRE_scoreCDS

对于每个Gene ID(例如ENST00000286800),原始矩阵中有几个UTR3(这里两个UTR3 对应ENST00000286800,一个UTR3 对应ENST00000345080)我们选择第三列中得分最高的UTR3。在新矩阵中,每个Gene IDUTR3 的值将是原始矩阵第二列中UTR3 的值。

任何机构可以帮助我重塑这些数据并构建我的新矩阵吗?

【问题讨论】:

  • 你让自己陷入了相当痛苦的境地;责任在于创建该“csv”文件的任何人或任何人。您对创建它的过程有任何控制吗?在那里修复它听起来是一个更好的主意(如果可以的话)。如果是这样,我们可以向您展示文件的外观,以便您可以使用read.csv 轻松加载它,并过滤每个基因的最佳UTR3 记录。
  • 不,是别人创建的,我无法控制它! P

标签: r csv matrix reshape


【解决方案1】:

您可以尝试使用正则表达式构建 CSV:

textfile <- "ENST00000286800 ENSG00000156273 (BACH1) hsa-let-7a-5p   1
UTR3    21:30717114-30717142    0.05994568  
UTR3    21:30717414-30717442    0.13591267  
ENST00000345080 ENSG00000187772 (LIN28B)    hsa-let-7a-5p   1
UTR3    6:105526681-105526709   0.133514751"
txt <- readLines(textConnection(textfile))

sepr <- grepl("^ENST.*", txt) 
r <- rle(sepr)
r <- r$lengths[!r$values]

regex <- "(\\S+)\\s+(\\S+)\\s(\\([^)]+\\)\\s+\\S+)\\s+(\\d+)"
m <- regexec(regex, txt[sepr])
m1 <- as.data.frame(t(sapply(regmatches(txt[sepr], m), "[", 2:5)))
m1 <- m1[rep(1:nrow(m1), r),]

regex <- "(\\S+)\\s+(\\S+)\\s+(\\S+)"
m <- regexec(regex, txt[!sepr])
m2 <- as.data.frame(t(sapply(regmatches(txt[!sepr], m), "[", 2:4)))

df <- cbind(m1, m2[,-1])
names(df) <- c("Transcript Id",    "Gene Id(name)",   "Mirna Name",        "miTG score",    "UTR3",        "MRE_score"   )
rownames(df) <- NULL
df
# Transcript Id   Gene Id(name)                Mirna Name miTG score                  UTR3   MRE_score
# 1 ENST00000286800 ENSG00000156273     (BACH1) hsa-let-7a-5p          1  21:30717114-30717142  0.05994568
# 2 ENST00000286800 ENSG00000156273     (BACH1) hsa-let-7a-5p          1  21:30717414-30717442  0.13591267
# 3 ENST00000345080 ENSG00000187772 (LIN28B)    hsa-let-7a-5p          1 6:105526681-105526709 0.133514751

【讨论】:

    【解决方案2】:

    使用此测试数据:

    Lines <- " Transcript Id   Gene Id(name)   Mirna Name  miTG score
    ENST00000286800 ENSG00000156273 (BACH1) hsa-let-7a-5p   1
    UTR3    21:30717114-30717142    0.05994568  
    UTR3    21:30717414-30717442    0.13591267  
    ENST00000345080 ENSG00000187772 (LIN28B)    hsa-let-7a-5p   1
    UTR3    6:105526681-105526709   0.133514751"
    

    全部阅读并设置名称,nms 用于输出。然后使用累积和计算分组向量cs。非重复项是每组的第一行,重复项是以下行。将这两组行按组合并,提取出每组中最高的MRE_score

    DF <- read.table(text = Lines, header = TRUE, fill = TRUE, as.is = TRUE, 
             check.names = FALSE)
    nms <- c("cs", names(DF)[1:5], "UTR3", "MRE_score") # out will have these names
    DF$cs <- cumsum(!is.na(DF$Mirna)) # groups each ENST row with its UTR3 rows
    dup <- duplicated(DF$cs) # FALSE for ENST rows and TRUE for UTR3 rows
    both <- merge(DF[!dup, ], DF[dup, ], by = "cs")[c(1:6, 11:12)]  # merge ENST & UTR3 rows
    names(both) <- nms
    both$MRE_score <- as.numeric(both$MRE_score)
    Rank <- function(x) rank(x, ties.method = "first")
    out <- both[ave(-both$MRE_score, both$cs, FUN = Rank) == 1, -1] # only keep largest score
    

    我们得到:

    > out
           Transcript              Id     Gene      Id(name) Mirna                  UTR3 MRE_score
    2 ENST00000286800 ENSG00000156273  (BACH1) hsa-let-7a-5p     1  21:30717414-30717442 0.1359127
    3 ENST00000345080 ENSG00000187772 (LIN28B) hsa-let-7a-5p     1 6:105526681-105526709 0.1335148
    

    请注意,该问题指的是 CDS 列,但没有描述它的内容,也没有出现在示例输出中,因此我们忽略了它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-15
      • 1970-01-01
      • 2018-08-03
      • 2017-03-20
      • 2018-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多