如果列表之间不共享,则从列表中删除项目
Remove items from list if not shared between lists
一些示例数据
List1 = list("Jake009", "Sarah0390", "Tom_338", "Philip-478")
List2 = list("Jake__98", "Sarah//43", "Brett-49")
我想从列表 1 中删除所有在列表 2 中没有匹配项的项目。
因此,代码需要检查两个列表中的每个字符串,直到第一个非字母字符(例如 "Jake" ),然后查看另一个列表中是否存在匹配项。
如果不是,请将其从列表中删除。
目标:
List1 = "Jake009", "Sarah0390"
List2 = "Jake__98", "Sarah//43"
我们在 lists
中删除带有 sub
的非字母字符,并使用 %in%
获取一个元素相对于另一个元素的逻辑索引。
v1 <- sub('[^A-Za-z]+$', '', unlist(List1))
v2 <- sub('[^A-Za-z]+$', '', unlist(List2))
List1[v1 %in% v2]
#[[1]]
#[1] "Jake009"
#[[2]]
#[1] "Sarah0390"
List2[v2 %in% v1]
#[[1]]
#[1] "Jake__98"
#[[2]]
#[1] "Sarah//43"
或按照@Frank
的建议使用intersect
vv1 <- setNames(List1,v1)
vv2 <- setNames(List2,v2)
both <- intersect(names(vv1),names(vv2))
vv1[both]
vv2[both]
一些示例数据
List1 = list("Jake009", "Sarah0390", "Tom_338", "Philip-478")
List2 = list("Jake__98", "Sarah//43", "Brett-49")
我想从列表 1 中删除所有在列表 2 中没有匹配项的项目。
因此,代码需要检查两个列表中的每个字符串,直到第一个非字母字符(例如 "Jake" ),然后查看另一个列表中是否存在匹配项。 如果不是,请将其从列表中删除。
目标:
List1 = "Jake009", "Sarah0390"
List2 = "Jake__98", "Sarah//43"
我们在 lists
中删除带有 sub
的非字母字符,并使用 %in%
获取一个元素相对于另一个元素的逻辑索引。
v1 <- sub('[^A-Za-z]+$', '', unlist(List1))
v2 <- sub('[^A-Za-z]+$', '', unlist(List2))
List1[v1 %in% v2]
#[[1]]
#[1] "Jake009"
#[[2]]
#[1] "Sarah0390"
List2[v2 %in% v1]
#[[1]]
#[1] "Jake__98"
#[[2]]
#[1] "Sarah//43"
或按照@Frank
的建议使用intersect
vv1 <- setNames(List1,v1)
vv2 <- setNames(List2,v2)
both <- intersect(names(vv1),names(vv2))
vv1[both]
vv2[both]