我有两个要比较的列表。我想看看列表中每个元素的值是否相等。
> 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)
然而,m1
contains 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
。
归档时间: |
|
查看次数: |
4361 次 |
最近记录: |