使用列表从矩阵中提取行

时间:2014-11-12 10:36:56

标签: r csv matrix rows subset

大家早上好

我仍然对R很新,我在大多数论坛上搜索我的问题的答案(我怀疑我错过了一个关键的关键字),所以如果我复制一个问题就道歉。我的问题类似于this question,但答案对我来说并不适用。

我有一个1.7米多行的矩阵,此时有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的矩阵)并尝试根据列进行分组“ animalID”。我最关心的是我要导入并用于子集化的列表。

提前致谢!

1 个答案:

答案 0 :(得分:1)

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

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