1、table()元素的提取
参考链接:https://blog.csdn.net/wlt9037/article/details/76570155
(1)table函数专注用于统计值的频数,非常好用。
我们有一组值cell_1$Func.refGene,类似于这种,
[895] “intergenic” “exonic” “UTR3”
[898] “exonic” “UTR3” “exonic”
[901] “intronic” “intronic” “intronic”
[904] “intronic” “UTR3” “UTR3”
[907] “UTR3” “UTR3” “intronic”
[910] “exonic” “UTR3” “exonic”
[913] “exonic” “UTR3” “UTR5”
[916] “UTR3” “UTR3” “UTR3”
……
我们想要知道不同的类型的值有多少,可以使用table函数。
class_label<-table(cell_1$Func.refGene)
class_label的值可以表达为:
. downstream exonic intergenic
1 8 223 245
intronic ncRNA_exonic ncRNA_intronic upstream
192 25 43 18
upstream;downstream UTR3 UTR5
5 463 91
这里的每一个标签是一个label,下面的数字代表的是各个label出现的频数。
(2)提取label为某值的频数
chrM<-as.numeric(table(cell_1$Chr=="chrM")[2])
对这个函数进行拆解。首先,就是判断chr是否等于“chrM”,其次,进行table处理,取出为TRUE的项,最后,提取为TRUE的项的频数。从而实现了我们的需求。
(3)将table转换为data.frame
这里也很简单,直接as.data.frame即可。
class_label<-as.data.frame(table(cell_1$Func.refGene))
2.提取数据框中特定行列的值。
使用which函数,可以提取行号,然后再根据行号,找到对应的列的值。
class_label[which(class_label$Var1=="intergenic"),2]
3、去除factor多余的levels
[679] nonframeshift substitution nonsynonymous SNV synonymous SNV
[682] UTR3 UTR5 Other
[685] chrM frameshift substitution nonframeshift substitution
[688] nonsynonymous SNV synonymous SNV UTR3
[691] UTR5 Other
26 Levels: . downstream exonic intergenic intronic ncRNA_exonic … ncRNA_splicing
. downstream exonic
0 0 0
intergenic intronic ncRNA_exonic
0 0 0
ncRNA_intronic upstream upstream;downstream
0 0 0
UTR3 UTR5 frameshift substitution
88 88 88
nonframeshift substitution nonsynonymous SNV startloss
76 88 0
stopgain stoploss synonymous SNV
0 0 88
可以看到有些level的值是为零的。所以,我们现在想要删去这些为零的level。
cell_count$Var1<-droplevels(cell_count$Var1)
参考链接:https://www.jianshu.com/p/9d312f0d8b3a
4、把NA项设为0。
cell_count[is.na(cell_count$average)]<-0
5。将数据框,两列合并,并且通过“特殊符号”连接起来。
使用within函数。
mutation_cell_1<-within(mutation_cell_1, mutation<- paste(V4,V5,sep="->"))
6。判断元素是否属于某个集合
常常我们会遇到的情况是,想要提取属于某一个list中的数,这个时候就要用到符号%in%
。
如:
a_s<-subset(a,Title%in%d,select = c("Accession","Title"))
提取属于d中的元素的Title名。然后再提取a中title名是d中元素的subset。
7。使用grep函数,提取指定的字符
如,提取a$Title中,以K562为开头的字符。
d<-grep("^K562",a$Title,value = T)
更多的使用,参见对grep()
函数的介绍。
8。整合两个数据集(两个数据集间有共有的列)
当然是用merge()
函数。
e<-merge(a_s,b_s,by.x="Accession",by.y="Sample.Name") #安装a_s数据框的Accession列,以及安装b_s的Sample.Name,整合。保留能够match的行。
9。去除数据框中的NA值
使用na.omit()
函数,直接去除NA值。
h<-as.data.frame(na.omit(h))
10。使用str函数拆分指定字符串
g #g的初始值
[1] "X48" "X52" "X56" "X72" "X49" "X51" "X75" "X65" "X54" "X55" "X82" "X64" "X71" "X78" "X68" "X80" "X81" "X47" "X69"
[20] "X67" "X77" "X84" "X90" "X66" "X74" "X76" "X88" "X59" "X63" "X57" "X70" "X73" "X60" "X53" "X61" "X83" "X79" "X50"
[39] "X62" "X22" "X40" "X1" "X2" "X18" "X3" "X23" "X19" "X27" "X13" "X14" "X9" "X10" "X24" "X29" "X34" "X16" "X31"
[58] "X35" "X15" "X41" "X6" "X26" "X11" "X42" "X21" "X28" "X17" "X4" "X25" "X12" "X8" "X20" "X32" "X7" "X30" "X33"
[77] "X36"
g<-strsplit(g,"X") #以X作为分隔符,拆分字符串
g #最后的结果如下
[[1]]
[1] "" "48"
[[2]]
[1] "" "52"
[[3]]
[1] "" "56"
……
11。使用unlist()对list数据进行拆分
unlist()
函数,在绘制boxplot图的时候也比较常用。
g #最后的结果如下 #接着上面
[[1]]
[1] "" "48"
[[2]]
[1] "" "52"
[[3]]
[1] "" "56"
h<-as.numeric(unlist(g))
h
[1] NA 48 NA 52 NA 56 NA 72 NA 49 NA 51 NA 75 NA 65 NA 54 NA 55 NA 82 NA 64 NA 71 NA 78 NA 68 NA 80 NA 81 NA 47 NA 69
[39] NA 67 NA 77 NA 84 NA 90 NA 66 NA 74 NA 76 NA 88 NA 59 NA 63 NA 57 NA 70 NA 73 NA 60 NA 53 NA 61 NA 83 NA 79 NA 50
[77] NA 62 NA 22 NA 40 NA 1 NA 2 NA 18 NA 3 NA 23 NA 19 NA 27 NA 13 NA 14 NA 9 NA 10 NA 24 NA 29 NA 34 NA 16 NA 31
[115] NA 35 NA 15 NA 41 NA 6 NA 26 NA 11 NA 42 NA 21 NA 28 NA 17 NA 4 NA 25 NA 12 NA 8 NA 20 NA 32 NA 7 NA 30 NA 33
[153] NA 36
12。使用match()函数,让数据集按照特定的顺序排列
loc <- match(h$`na.omit(h)`,f$V1) #获取h的顺序
j<-f[loc,] #让f的行按照这样的顺序排列
现在先写到这里,以后用到其他比较特殊的小技巧会再进行补充。要重视经验的提取和再利用。