使用数字索引 - 子集命令和具有错误的循环子集矩阵

时间:2017-02-25 12:26:50

标签: r matrix subset

我有以下矩阵“m”(nrow = 2504,ncol = 2),有两列;一个名为ind(来自索引),另一个名为headerline(样本的ID):

> head(m)
     ind headerline
[1,] "1" "HG00096" 
[2,] "2" "HG00097" 
[3,] "3" "HG00099" 
[4,] "4" "HG00100" 
[5,] "5" "HG00101" 
[6,] "6" "HG00102" ...

以下索引向量称为“index”(nr = 385,nc = 1):

> head(index)
  V1
1  1
2  4
3  9
4 12
5 13
6 16 ...

我想在索引标记的行位置中对样本进行子集化(我希望在第1行中有样本的新矩阵,第4行中的样本,第9行中的样本等等)。我想出了以下代码:

 for i in index { dudosos<-subset(headerline,ind==i, select=c(headerline)) }

但会产生以下错误:

  

错误:“for i”中的意外符号

我不知道那个错误告诉我的是什么,它太模糊了。救命?谢谢!

期望的输出:

> head(m)               #or other name
         ind headerline
         "1" "HG00096"   
         "4" "HG00100" 
         "9" ...

2 个答案:

答案 0 :(得分:2)

没有举例说明你想要归还的内容,即我猜你所追求的是什么。我会说你有兴趣在不需要for循环的情况下查看%in%运算符。

使用您的示例数据:

library(data.table)

m <- data.table(id = c("1", "2", "3", "4", "5", "6", "7", "8", "9"), headerline = c("HG00096", "HG00097", "HG00099", "HG00100", "HG00101", "HG00102","HG00103", "HG00104", "HG00105"))

index <- c("1", "4", "9")

output <- m[id %in% index,]

输出如下所示:

> output
   id headerline
1:  1    HG00096
2:  4    HG00100
3:  9    HG00103

所以我们返回了一个新的数据表output,其中包含m中id列和索引向量共有的行。

这是你追求的吗?

答案 1 :(得分:1)

你可以在基地完成所有这些:

for (i in index){ ... }

这个或@ Gin_Salmon的答案是实现目标的最佳方式......

这是对您的代码无效的原因的解释:

您的代码存在一些问题:
 1.你的for循环交互需要在()中:subset(as.data.frame(m), ind == i, select = headerline)
 2.您的子集命令应为:dudosos
 3.你的循环在每次迭代时覆盖dudosos[i, ] <- subset(m, ind == i, select = headerline) m <- matrix(c("1", "2", "3", "4", "5", "6", "7", "8", "9", "HG00096", "HG00097", "HG00098", "HG00099", "HG00100", "HG00101","HG00102", "HG00103", "HG00103"), ncol=2) index <- data.frame(V1= c("1", "4", "9")) colnames(m) <- c("ind","headerline") dudosos <- data.frame() for (i in index$V1) { dudosos <- rbind(dudosos, subset(x = as.data.frame(m) , subset = ind == i, select=headerline)) }

   $headers = $message->getHeaders();

   $headers->addTextHeader('AccountId', $accountId);

再一次,其他解决方案要好得多,但有时它也有助于了解您最初编写的代码无法正常工作的原因。