最近我开始研究R并试图复制我的一些python项目。 例如,我有两个向量:
k = c(1,2,3,4,11,23,24,25,26)
l = c(1,2,3,4,5,6,7,8,11)
功能:
test_function <- function(b) {
if (b %in% l) {
return(b)
}
运行功能后
sapply(k, test_function)
它也返回NULL
[[1]]
[1] 1
[[2]]
[1] 2
[[3]]
[1] 3
[[4]]
[1] 4
[[5]]
[1] 11
[[6]]
NULL
[[7]]
NULL
[[8]]
NULL
[[9]]
NULL
为什么返回NULL?谢谢你的任何解释。
答案 0 :(得分:0)
k = c(1,2,3,4,11,23,24,25,26)
l = c(1,2,3,4,5,6,7,8,11)
我猜你实际上希望测试k
中找到的l
的每个元素:
k[ sapply(k, `%in%`, l) ] # inner result is logical vector used to select items
#[1] 1 2 3 4 11
if
函数不适合单独测试多个条件,但我猜您怀疑。 sapply
函数返回一个列表,其中包含传递的每个项的值,然后因为结果中有NULL,它无法简化。 R不认为NULL与NA相同。如果你构造了test_function
,那么当一个项目不在测试向量中时,NA会被重新启动,那么sapply就能够简化:
test_function2 <- function(b) {
if (b %in% l) {
return(b)
} else{NA} }
sapply( k, test_function2)
#[1] 1 2 3 4 11 NA NA NA NA
我看到提及intersect
的评论,在进行集合比较时也是一个很好的记忆功能。然后还有match
:
k[ match(l,k)] # match returns position indexing
[1] 1 2 3 4 NA NA NA NA 11