R-按照行名或列名删除对应的行列

R-按照行名或列名删除对应的行列

项目需求 近期在处理单细胞项目数据,想对基因和read数构成的矩阵文件做进一步的处理,比如删除一些指定基因,删除一些指定细胞,查了一些材料并没发现合适的解决方案,所以有必要遂基于参考材料在具体描述一下这类数据处理方法。

1234567891011#常规删除行列数据dataly<- data.frame(a=1:2, b=2:3, c=3:4, d=4:5,e=5:6)rownames(dataly)<- c("m","n")datalya b c d em 1 2 3 4 5n 2 3 4 5 6#删除第一行dataly1<- dataly[-1,]#删除第三列dataly2<- dataly[,-3]

积极实践 这种对于小样本来说处理比较方便,但是对于单细胞海量数据,这种处理方式显然是行不通的。特别是删除指定的基因或者细胞,对于具体所处的行列也不明确。比较直接的方式是直接根据行或者列的名字,直接匹配删除。接下来介绍一些基于这种类型数据的处理方式。

1234567891011121314datalya b c d em 1 2 3 4 5n 2 3 4 5 6#删除b,d列的处理方式,-which 可以用!代替dataly[ , -which(colnames(dataly) %in% c("b","d"))] a c em 1 3 5n 2 4 6dataly[ , !colnames(dataly) %in% c("b","d")]#删除n行的处理方式dataly[!rownames(dataly) %in% c("n") , ] a b c d em 1 2 3 4 5

他山之石谷歌一下发现还有不少解决方案,个人比较喜欢这个。

123456789101112131415161718192021222324252627282930313233343536373839#数据生成X<-data.frame(A=c(1,2),B=c(3,4),C=c(5,6))X A B C1 1 3 52 2 4 6#如果我想删除一个列,比如B,只需在colnames上使用grep来获取列索引,然后可以使用该索引来省略列。X[,-grep("B",colnames(X))] A C1 1 52 2 6#grep的优点在于您可以指定与正则表达式匹配的多个列。如果我有五列X(A,B,C,D,E):X<-data.frame(A=c(1,2),B=c(3,4),C=c(5,6),D=c(7,8),E=c(9,10))X A B C D E1 1 3 5 7 92 2 4 6 8 10#取出B栏和D栏:X<-X[,-grep("B|D",colnames(X))] A C E1 1 5 92 2 6 10#考虑到马修伦德伯格在下面的评论中的grepl建议:> X<-data.frame(A=c(1,2),B=c(3,4),C=c(5,6),D=c(7,8),E=c(9,10))> X A B C D E1 1 3 5 7 92 2 4 6 8 10> X<-X[,!grepl("B|D",colnames(X))]> X A C E1 1 5 92 2 6 10#如果我尝试删除一个不存在的列,则不会发生任何事情:> X<-X[,!grepl("G",colnames(X))]> X A C E1 1 5 92 2 6 10

参考材料:https://stackoverflow.com/questions/5234117/how-to-drop-columns-by-name-in-a-data-frame

相关推荐