【问题标题】:Extract rows from a matrix using a list使用列表从矩阵中提取行
【发布时间】:2015-01-09 04:20:04
【问题描述】:

大家早上好

我对 R 还很陌生,我在大多数论坛上搜索了我的问题的答案(我怀疑我在某个地方错过了一个关键关键字),所以如果我重复一个问题,我深表歉意。我的问题类似于this question,但答案对我来说不太适用。

我有一个有 170 万行的矩阵,此时有 20 列。出于本练习的目的,我只需要从该矩阵中提取 20 行,但以后需要做 1000 多行。我希望能够将我想要子集化的所有行的列表导入到一个较小的矩阵中以进行进一步分析,并继续我的头撞墙。

我创建了一个只有 2 列感兴趣的较小矩阵,并将行名称设置为动物 ID。动物 ID 是唯一的。为笨拙的编码道歉。

EBV<-read.csv(file='bfile.csv', header=F, skip=1, sep=',', col.names=c("animal","anim_name","byear","anim_name_pa","anim_name_ma","sex","wwdir_ebv","wwdir_acc","wwmat_ebv","wwmat_acc","afc_ebv","afc_acc","icp_ebv","icp_acc","shd_ebv","shd_acc","scr_ebv","scr_acc","adg_ebv","adg_acc"))
head(EBV)
tail(EBV)
a<-subset(EBV, select=c(animal))
b<-subset(EBV, select=c(wwdir_ebv,wwdir_acc))
c<-as.numeric(as.character(unlist(a)))
d<-as.numeric(as.character(unlist(b)))
x<-matrix(d, nrow=1708891,ncol=2, byrow=F)
rownames(x)<-c
colnames(x)<-c("wwdir_ebv","wwdir_acc")
head(x)

Results of head(x):

*row.name* wwdir_ebv wwdir_acc
33525056   12.0321        49
33702721   13.6674        46
33791336    6.8078        63
33907452   11.0981        51
33909847    7.4192        67
34165696    8.5039        42

现在我想做的是这样的:

EX<-read.csv(file='braz.csv', header=F, sep=',', col.names=c("Ani"))
X<-as.numeric(as.list(unlist(EX)))
z<-subset(x, select=c('X')

“braz.csv”文件仅包含一列,为了论证,动物为 33701721、33791336 和 33909847。逐一提取动物并没有太大问题,但键入1000个名字最终会一一对应。

我不知道将animalID保留在自己的列中会更有效(即,制作一个1.7mx 3而不是1.7mx 2的矩阵)并尝试根据列进行子集“动物ID”。我最担心的是我要导入并用于子集的列表。

提前致谢!

【问题讨论】:

  • 我不知道你为什么要这么麻烦地创建矩阵而不是使用read.csv返回的data.frame。您对subset 的使用也让我感到困惑(因为select 选择列,但显然您想按行进行子集化)。你可能只需要x[rownames(x) %in% unlist(EX),]吗?
  • 嗨@Roland。谢谢,我的问题解决了一半。当我检查您的解决方案时,我发现虽然它为我提供了我正在寻找的子集,但它还按数字对行名进行排序。我有另一个矩阵,我将使用这个矩阵进行计算,我确实需要保持动物订单相同。除非我也对基因型矩阵进行排序......会去检查它是否有效。
  • 我的代码不应该改变行顺序。
  • 嗨。检查。另一个矩阵是 76883 x 20,其中列是动物 ID。转置矩阵,根据 animalId 排序并重新转置它似乎是在浪费精力。于是我又回到源文件,按照aa
  • 我只能指出minimal reprodicible example的重要性。

标签: r csv matrix rows subset


【解决方案1】:

我不知道你为什么要这么麻烦地创建矩阵而不是使用 read.csv 返回的 data.frame。您对subset 的使用也让我感到困惑(因为select 选择列,但显然您想按行进行子集化)。

看来您只需要x[rownames(x) %in% unlist(EX),]。一般来说,你会发现[ 在子集化方面并不比subset 方便,但更强大。 subset 在函数内部使用时也会导致问题。我建议你学习help("[")help("%in%") 可能也值得一读。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    相关资源
    最近更新 更多