我有两个要比较的列表。我想看看列表中每个元素的值是否相等。
> m1
[[1]]
integer(0)
[[2]]
[1] 3 4
[[3]]
integer(0)
[[4]]
[1] 1
[[5]]
[1] 2 3 4
> m3
[[1]]
[1] 3
[[2]]
[1] 1 4
[[3]]
[1] 2
[[4]]
[1] 3
[[5]]
[1] 1 4
Run Code Online (Sandbox Code Playgroud)
我期望这样的结果:
> Result
[[1]]
[1]
FALSE
[[2]]
[1]
FALSE TRUE
[[3]]
[1]
FALSE
[[4]]
[1]
FALSE
[[5]]
[1]
FALSE FALSE TRUE
Run Code Online (Sandbox Code Playgroud)
如果我尝试申请m1[1] == m3[1]或类似,我会收到如下消息
m1 == m3 中的错误:未实现这些类型的比较。
这么简单的事我都做不到!提前感谢您的帮助。
> m1
[[1]]
integer(0)
[[2]]
[1] 3 4
[[3]]
integer(0)
[[4]]
[1] 1
[[5]]
[1] 2 3 4
> m3
[[1]]
[1] 3
[[2]]
[1] 1 4
[[3]]
[1] 2
[[4]]
[1] 3
[[5]]
[1] 1 4
Run Code Online (Sandbox Code Playgroud)
您可以将Map(或mapply) 与 一起使用%in%。
Map(`%in%`, m1, m3)
# [[1]]
# logical(0)
#
# [[2]]
# [1] FALSE TRUE
#
# [[3]]
# logical(0)
#
# [[4]]
# [1] FALSE
#
# [[5]]
# [1] FALSE FALSE TRUE
Run Code Online (Sandbox Code Playgroud)
然而,m1contains integer(0),这使得%in%returnlogical(0)而不是FALSE。所以你需要logical(0)稍后转换FALSE。
res <- Map(`%in%`, m1, m3)
res[lengths(res) == 0] <- FALSE
res
# [[1]]
# [1] FALSE
#
# [[2]]
# [1] FALSE TRUE
#
# [[3]]
# [1] FALSE
#
# [[4]]
# [1] FALSE
#
# [[5]]
# [1] FALSE FALSE TRUE
Run Code Online (Sandbox Code Playgroud)
另一种单行解决方案:
Map(`%in%`, m1, m3)
# [[1]]
# logical(0)
#
# [[2]]
# [1] FALSE TRUE
#
# [[3]]
# logical(0)
#
# [[4]]
# [1] FALSE
#
# [[5]]
# [1] FALSE FALSE TRUE
Run Code Online (Sandbox Code Playgroud)
注意:integer(0)[1]是NA并NA %in% y返回FALSE。