"枪响了"
"看到是谁开的枪了吗"
"看不清,他站在道德的制高点上,他在阳光下。"
——温特伯格《狩猎》
知其道,用其妙。
vector作为基础数据结构,用过R语言的人都不陌生。譬如索引,切片都是常见的操作,除了这些,向量还有一个属性,可以给每个元素一个名称。看似无所谓的属性,很多时候在实际操作中却很实用,很多好用的R包都用了这个特性,方便高效。
比如,单细胞使用seurat
做下游分析时,读取cellranger
的结果,一个样本无需纠结:
obj <- CreateSeuratObject(counts = Read10X('sample/filtered_feature_bc_matrix'), project = 'sample')
多个样本时,就可以利用命名向量的形式,一次性读取:
samdir
sample1
"sample1/filtered_feature_bc_matrix"
sample2
"sample2/filtered_feature_bc_matrix"
sample3
"sample3/filtered_feature_bc_matrix"
obj <- CreateSeuratObject(counts = Read10X(samdir))
与普通向量相比,简单来说命名向量就是多了一层名称的属性,就好像两个向量合二为一了。既然,可以合二为一,那么这种关系就可以利用起来,比如下面两个向量:
vec1 <- c('group1', 'group3', 'group2', 'group3', 'group1', 'group2')
vec2 <- c('red', 'blue', 'green')
如果要实现group1
、group2
、group3
分别与red
、blue
、green
对应起来,简单来说就是将vec1
的元素对应替换为vec2
的元素,怎么做比较方便?其实,这种需求在数据分析中还是很常见的,要说实现方式肯定不少,但最简单直接的还是利用向量的属性,即元素名称。
names(vec2) <- c('group1', 'group2', 'group3')
vec3 <- vec2[vec1]
vec3
group1 group3 group2 group3 group1 group2
"red" "green" "blue" "green" "red" "blue"
不过,现在应该用不到自己写代码了,只要能够把需求详细地描述出来,然后借助ChatGPT
来实现。
网友评论