R:带有列表的交叉引用向量,HELP:基于正命中附加新向量
Posted
技术标签:
【中文标题】R:带有列表的交叉引用向量,HELP:基于正命中附加新向量【英文标题】:R: Cross reference vector with list, HELP: append new vector based on positive hits 【发布时间】:2020-11-21 14:57:08 【问题描述】:我有一个向量 A 和一个向量 v1、v2 和 v3 的列表 B。我的目标是将列表 B 中包含 A 的一个或多个条目的向量组合成一个新向量 (new_v)。
A <- c("cat", "dog", "bird")
A
B <- list(v1 = c("mike", "fred", "paul"), v2 = c("mouse", "cat", "frog"), v3 = c("bird", "cow", "snake"))
B
new_list <- c()
for(i in names(B))
v <- A %in% B[[i]] ## test for elements of A in vectors of B
print(v)
if (TRUE %in% v) ## if TRUE (A is in vector of B),
## add vector of B to new_v
append(new_v, unlist(B[i])) ## doesn't do what I want
dput(new_v)
我希望的结果:
>dput(new_v)
c("mouse", "cat", "frog", "bird", "cow", "snake")
【问题讨论】:
【参考方案1】:这是一个带有Map
的单行代码。
unlist(Map(function(x, y) if(any(x %in% y)) y, list(A), B))
#[1] "mouse" "cat" "frog" "bird" "cow" "snake"
解释:
Map
将匿名函数应用于其列表参数的每个元素。由于list(A)
的长度为1,所以循环到列表B
的长度。
至于函数,如果x
的任何元素(向量A
)在y
(B
的每个向量)中,则返回y
,否则返回NULL
。
编辑
如果B
具有dim
属性集,则它可以是"matrix"
类或"data.frame"
类的对象(或从这些类之一继承)。
1.如果是矩阵,则强制为向量,不需要Map
。
if(any(A %in% as.vector(B))) B
# [,1] [,2]
#[1,] "mouse" "mice eat rats"
#[2,] "cat" "cats eat mice"
#[3,] "frog" "frogs frog frogs"
2.如果是data.frame,unlist
,上面是as.vector
。
B2 <- as.data.frame(B)
if(any(A %in% unlist(B2))) B2
# V1 V2
#1 mouse mice eat rats
#2 cat cats eat mice
#3 frog frogs frog frogs
【讨论】:
您好 Rui,我尝试扩展此代码,使其与 B 作为表一起使用,但我没有得到任何结果。 IE。B <- structure(c("mouse", "cat", "frog", "mice eat rats", "cats eat mice", "frogs frog frogs"), .Dim = c(3L, 2L))
。如果在 B 中找到来自 A 的一个或多个条目,我想取回整个表。我试过这个,但似乎我的逻辑不正确:(Map(function(x, y) if(any(x %in% y[[1]])) y, list(A), B))
@Matt 设置一个暗淡的属性会改变一些事情。尝试在我上面的代码中传递as.data.frame(B)
。您是否希望返回 both 列? (A
中的 cat
是否与 B[, 2]
中的 cats
匹配?)
太棒了,这样更好。理想情况下,应该返回两列,尽管没有搜索。所以只搜索B[, 1]
,但如果B[, 1]
中有任何A
,则输出应为B[,1:2]
哇,太棒了。非常感谢您的深入编辑!对掌握 R 中的数据类型有很大帮助:)【参考方案2】:
另一个选项是map2
来自purrr
library(purrr)
map2(list(A), B, ~ if(any(.x %in% .y)) .y) %>%
flatten_chr
#[1] "mouse" "cat" "frog" "bird" "cow" "snake"
【讨论】:
谢谢!使用 Map2 有什么好处? @Matt 如果您对 tidyverse 方法感兴趣,它会很好地融合以上是关于R:带有列表的交叉引用向量,HELP:基于正命中附加新向量的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用e1071包中的svm函数构建支持向量机SVM模型使用tune.svm函数基于网格搜索(10折交叉验证)对RBF核函数的gamma参数和cost参数进行参数寻优使用最优参数构建最终模型
R语言使用e1071包中的svm函数构建支持向量机SVM模型使用tune.svm函数基于网格搜索(10折交叉验证)对RBF核函数的gamma参数和cost参数进行参数寻优使用最优参数构建最终模型
R语言使用crossprod函数和tcrossprod函数计算矩阵matrix交叉积(Matrix Cross Product)crossprod函数tcrossprod函数计算矩阵和向量的交叉积