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