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)在yB的每个向量)中,则返回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 &lt;- 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中列表中相交向量的并集

R语言使用e1071包中的svm函数构建支持向量机SVM模型使用tune.svm函数基于网格搜索(10折交叉验证)对RBF核函数的gamma参数和cost参数进行参数寻优使用最优参数构建最终模型

R语言使用e1071包中的svm函数构建支持向量机SVM模型使用tune.svm函数基于网格搜索(10折交叉验证)对RBF核函数的gamma参数和cost参数进行参数寻优使用最优参数构建最终模型

附代码 |详解R语言的高级数据结构

在 R 中使用带有对象向量的“lines”命令

R语言使用crossprod函数和tcrossprod函数计算矩阵matrix交叉积(Matrix Cross Product)crossprod函数tcrossprod函数计算矩阵和向量的交叉积