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

项目需求

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

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

积极实践

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
dataly
a b c d e
m 1 2 3 4 5
n 2 3 4 5 6
#删除b,d列的处理方式,-which 可以用!代替
dataly[ , -which(colnames(dataly) %in% c("b","d"))]
a c e
m 1 3 5
n 2 4 6
dataly[ , !colnames(dataly) %in% c("b","d")]
#删除n行的处理方式
dataly[!rownames(dataly) %in% c("n") , ]
a b c d e
m 1 2 3 4 5

他山之石

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#数据生成
X<-data.frame(A=c(1,2),B=c(3,4),C=c(5,6))
X
A B C
1 1 3 5
2 2 4 6
#如果我想删除一个列,比如B,只需在colnames上使用grep来获取列索引,然后可以使用该索引来省略列。
X[,-grep("B",colnames(X))]
A C
1 1 5
2 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 E
1 1 3 5 7 9
2 2 4 6 8 10
#取出B栏和D栏:
X<-X[,-grep("B|D",colnames(X))]
A C E
1 1 5 9
2 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 E
1 1 3 5 7 9
2 2 4 6 8 10
> X<-X[,!grepl("B|D",colnames(X))]
> X
A C E
1 1 5 9
2 2 6 10
#如果我尝试删除一个不存在的列,则不会发生任何事情:
> X<-X[,!grepl("G",colnames(X))]
> X
A C E
1 1 5 9
2 2 6 10
参考材料:

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

-------------    本文结束  感谢您的阅读    -------------