使用数值索引子集命令的子集矩阵和带误差的for循环

使用数值索引子集命令的子集矩阵和带误差的for循环,r,matrix,subset,R,Matrix,Subset,我有以下矩阵“m”(nrow=2504,ncol=2),有两列;一个称为ind(来自索引),另一个称为headerline(样本ID): 以下索引向量称为“索引”(nr=385,nc=1): 我想在索引标记的行位置对样本进行子集划分(我想要一个新矩阵,第1行有样本,第4行有样本,第9行有样本,依此类推)。我想出了以下代码: for i in index { dudosos<-subset(headerline,ind==i, select=c(headerline)) } 没有给你一个

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

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

我想在索引标记的行位置对样本进行子集划分(我想要一个新矩阵,第1行有样本,第4行有样本,第9行有样本,依此类推)。我想出了以下代码:

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

没有给你一个你想要被退回的例子,比如我在猜测你想要什么。我想说的是,您有兴趣在%操作符中查看
%,而不需要for循环

使用您的示例数据:

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
,其中包含
m
中id列和索引向量共有的行


这就是你想要的吗?

没有给你一个你想要的回报的例子,也就是说,我在猜测你想要的是什么。我想说的是,您有兴趣在%
操作符中查看
%,而不需要for循环

使用您的示例数据:

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
,其中包含
m
中id列和索引向量共有的行


这就是你想要的吗?

你可以在base中完成这一切:

m <- matrix(c("1", "2", "3", "4", "5", "6", "7", "8", "9", 
              "HG00096", "HG00097", "HG00098", "HG00099", "HG00100", "HG00101","HG00102", "HG00103", "HG00103"), ncol=2)
index <- c("1", "4", "9") 

m[m[, 1] %in% index, ]

同样,其他的解决方案要好得多,但有时它也有助于了解您最初编写的代码为什么不起作用

您可以在base中完成这一切:

m <- matrix(c("1", "2", "3", "4", "5", "6", "7", "8", "9", 
              "HG00096", "HG00097", "HG00098", "HG00099", "HG00100", "HG00101","HG00102", "HG00103", "HG00103"), ncol=2)
index <- c("1", "4", "9") 

m[m[, 1] %in% index, ]

同样,其他的解决方案要好得多,但有时它也有助于了解您最初编写的代码为什么不起作用

对不起!过去的评论是错误的,这就是我删除它的原因。现在,我粘贴了您的更新代码,它可以工作,但它会生成一个空矩阵。具有0列和2503行的数据帧显示消息:1:In is.na(e1)| is.na(e2):较长的对象长度不是较短对象长度的倍数2:In
=.default
(ind,i):较长的对象长度不是较短对象长度的倍数,因此索引似乎不是向量而是数据帧,因此,您需要指定列。我还强制将I设置为字符,因为
m
是字符。正如您所说,我在%index$V1中设置了m[m[,“ind”]%,而且效果非常好!谢谢!!!!:)。请在您的第一个答案中编辑该错误,使其完整。我把它作为官方答案“核对”了。对不起!过去的评论是错误的,这就是我删除它的原因。现在,我粘贴了您的更新代码,它可以工作,但它会生成一个空矩阵。具有0列和2503行的数据帧显示消息:1:In is.na(e1)| is.na(e2):较长的对象长度不是较短对象长度的倍数2:In
=.default
(ind,i):较长的对象长度不是较短对象长度的倍数,因此索引似乎不是向量而是数据帧,因此,您需要指定列。我还强制将I设置为字符,因为
m
是字符。正如您所说,我在%index$V1中设置了m[m[,“ind”]%,而且效果非常好!谢谢!!!!:)。请在您的第一个答案中编辑该错误,使其完整。我“检查”了它作为正式答案。对不起,当我按照您的方式或@Emiliman建议的方式进行操作时,它会生成一个包含两个字符条目“ind”和“headerline”的对象。col name:/对不起,当我按照您的方式或@emiliman5建议的方式进行操作时,它会生成一个包含两个字符条目“ind”和“headerline”的对象。col名称:/
> output
   id headerline
1:  1    HG00096
2:  4    HG00100
3:  9    HG00103
m <- matrix(c("1", "2", "3", "4", "5", "6", "7", "8", "9", 
              "HG00096", "HG00097", "HG00098", "HG00099", "HG00100", "HG00101","HG00102", "HG00103", "HG00103"), ncol=2)
index <- c("1", "4", "9") 

m[m[, 1] %in% index, ]
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)) 
 }