【问题标题】:How to separate rows in a column based on a specification?如何根据规范分隔列中的行?
【发布时间】:2013-06-21 09:35:28
【问题描述】:

我有一个 2 列的矩阵,矩阵的开头如下所示:

          SNP           Pi1         
[1,] "SNP_Label"   "Pi1"         
[2,] "rs482519"    "0.3722219"   
[3,] "rs12196956"  "0.3212364"   
[4,] "CNV548726"    "0.3112315"   
[5,] "CNV356212"    "0.3078721"   
[6,] "rs4792617"   "0.3023402"   
[7,] "CNV2095401"   "0.2979626"   
[8,] "CNV4528251"   "0.29391"     
[9,] "rs9369426"   "0.2860793"   
[10,] "rs31672"     "0.2790241"   
[11,] "rs1323446"   "0.2778401"   

规范是我想把以“rs”开头的SNP和以“CNV”开头的SNP分开,并为每个得到一个新的矩阵2 种类型的 SNPS 及其对应的 Pi1 值。 SNP 的名称都是随机的,因此“rs”或“CNV”将随机出现在列中。

我想我可能需要一个 for 循环来遍历 SNP 列中每个条目的前 2 个字符,但我不知道这是否正确。

【问题讨论】:

  • ...为什么您的数据是矩阵而不是数据框?你确定你已经正确导入了吗?
  • 我不确定。我总是使用data <- read.table() 导入数据。这是否将我的数据作为矩阵或 data.frame 提供给我?有区别吗??
  • 对。您需要使用read.table(*, header=TRUE) 导入。看到矩阵的第一行了吗?这些是您的列名。如果没有header=TRUE 位,R 会将它们视为数据的一部分。除了给你一个虚假的行之外,它还弄乱了第二列,R 已经将它作为文本而不是数字导入,我猜它应该是这样的。

标签: r row multiple-columns bioinformatics


【解决方案1】:

将其设为 data.frame,然后执行以下操作:

mylabel <- gsub("[0-9]", "", my.df[[1]])
list.of.dfs <- split(my.df, mylabel)

这样做的方式是 mylabel 只会在 gsub 之后的第一列中保留字母标识符。然后 split 将根据这些标识符将您的 data.frame 分成块。

将为您提供包含所有唯一标签的 data.frames 列表。之后可以选择名称为“rs”和“CNV”的名称。

$CNV
      V1        V2
3  CNV548726 0.3112315
4  CNV356212 0.3078721
6 CNV2095401 0.2979626
7 CNV4528251 0.2939100

$rs
       V1        V2
1    rs482519 0.3722219
2  rs12196956 0.3212364
5   rs4792617 0.3023402
8   rs9369426 0.2860793
9     rs31672 0.2790241
10  rs1323446 0.2778401

【讨论】:

  • 谢谢,我刚试过,它给了我一个错误提示:错误:“mylabel
  • 我喜欢这个解决方案,因为它兜售列表的概念,我觉得它更方便,至少从长远来看是这样。 @zfzhao 有两行代码(我刚刚重新格式化)。再试一次。
  • 抱歉,我有点草率。我已经修好了。
  • 感谢你们的真棒建议 :-) 是的,它现在正在工作!
  • @RomanLuštrik:由于某种原因,我无法让[:digits:] 在这里工作。你能提醒一下正确的符号是什么吗?我正在尝试在 shell 中使用的符号,但它不起作用。
【解决方案2】:
a <- data.matrix(cbind(c("rs1","CNV1","rs2","CNV2"),c("a","b","c","d")))
rs <- a[grep("^rs",a),]
cnv <- a[grep("^CNV",a),]

使用 grep 查找您的模式,“^”检查模式是否位于开头。

【讨论】:

  • 这段代码叫什么?我输入了,但我应该调用什么来获得最终结果?
  • 抱歉,我首先制作了一个像你这样的矩阵,我称之为“a”。然后我制作了 2 个仅包含 rs(称为“rs”)和仅包含 cnv(称为“cnv”)的新矩阵对象。您只需要最后两行,并将“a”替换为您的矩阵名称
猜你喜欢
  • 1970-01-01
  • 2021-01-25
  • 2014-12-06
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
  • 2013-07-31
  • 1970-01-01
相关资源
最近更新 更多