大家好,这里 【生信摆渡】。
获取更好阅读体验:R语言-快速对多个变量取交集
两个变量取交集
众所周知,在R
中,两个变量取交集可以使用intersect
函数:
R
# 两个变量取交集
string1 = letters
string2 = strsplit("Hello, bioinfobaidu!", "")[[1]]
intersect(string1, string2)
# [1] "a" "b" "d" "e" "f" "i" "l" "n" "o" "u"
随着输入变量增多,书写起来会逐渐麻烦,因为intersect
只能接受两个变量。
结果就会形成套娃的样子,比如四个变量取交集:
R
# 四个变量取交集
string1 = letters
string2 = strsplit("Hello, bioinfobaidu!", "")[[1]]
string3 = strsplit("wo zui niu bi", "")[[1]]
string4 = strsplit("wo shi sha bi", "")[[1]]
intersect(string1, intersect(string2, intersect(string3, string4)))
# [1] "b" "i" "o"
非常不方便。
那么我来10个变量,阁下又如何应对?
生成10个数字集合:
R
# 生成10个数字集合
for(i in 1:10){
var_name = paste0("var", i)
set.seed(i)
nums = sample(1:100, 80)
assign(var_name, nums)
}
多个变量取交集
遇到这种需要逐个计算的,交给Reduce
函数就行了。
使用Reduce
函数可以大大减少代码量和提高代码美观性,可以用一个美字来形容。早就想介绍了,这次先抛砖引玉不展开,下次再重点介绍!
Reduce
函数接受两个变量,一个是处理方法,也就是函数,这个函数必须是二元函数。
另一个参数是列表或者是向量,对列表内的元素逐个进行累计二元运算
,就是先将前两个元素进行运算,之后将结果与第三个元素进行运算,以此类推。
这完美符合我们的需求好吧~
比如四个变量:
R
Reduce(intersect, list(string1, string2, string3, string4))
# [1] "b" "i" "o"
至少在美观上,简单了许多。
而对于变量名有规律的情况来说,不管多少变量,只需要短短的一行代码。
比如上面的10个变量:
R
Reduce(intersect, lapply(paste0("var", 1:10), get))
# [1] 87 59 21 84 42 24 18 76 16
甚至,我们可以编写一个新的函数intersect2
来进一步简化这一过程。
intersect2
R
intersect2 <- function(...) Reduce(intersect, list(...))
这里用到了三个点...
来接受要输入的变量,你想输入几个就输入几个,用逗号,
隔开就行,非常方便。
试试:
R
intersect2(string1, string2, string3, string4)
# [1] "b" "i" "o"
一个字,妙~~~啊~
学习生信知识,请持续关注 【生信摆渡】。