如何比较 R 中的两个列表

Car*_*rpa 5 compare r list

我有两个要比较的列表。我想看看列表中每个元素的值是否相等。

> 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)

Dar*_*sai 4

您可以将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]NANA %in% y返回FALSE