首页 文章

R:如何在另一个向量中粘贴完整的向量

提问于
浏览
1

我正在尝试在向量中使用字符串来调出另一个向量,以便所有内容都将在paste命令中输出 . 然后我使用这些字符向量来过滤掉数据帧 .

使用mtcars数据框作为示例(将行名称转换为列,以便我可以使用某些字符)...

df < - mtcars df $ Cars < - rownames(df)

我对以下向量感兴趣

allSearches = c(“SearchA”,“Search1”)

并且“SearchA”和“Search1”被定义为......

SearchA = c(“mazda”,“honda”)Search1 = c(“merc”,“toyota”)

我希望能够通过SearchA中的变量过滤数据框df,然后通过Search1中的变量过滤数据框df .

对于单独的代码行,我可以使用以下代码...

sub = df [grepl(paste(Search1,collapse =“|”),df $ Cars,ignore.case = T),] sub $ SearchA < - “是”df = merge(df,sub,all.x = T)

这样做的目的是让它处于“for”循环中,以便我可以在需要时添加其他搜索 .

我试过以下......

for(i in 1:length(allSearches)){sub = df [grepl(paste(allSearches [i],collapse =“|”),df $ Cars,ignore.case = T),] sub [,allSearches [ i]] < - “是”df = merge(df,sub,all.x = T)}

但我得到以下错误......

[< - . data.frame(* tmp * ,, allSearches [i],value =“Yes”)出错:替换有1行,数据有0

在尝试剖析问题时,我发现这个特定方法的问题在于“粘贴”功能,其中...

粘贴(allSearches [1],collapse =“|”)

输出以下内容......

“SearchA”

而不是完整的矢量

[1]“mazda”“honda”

任何帮助将不胜感激 . 我正在处理很多适合“allSearches”内部的“搜索”,因此在循环中获取所有内容会很好,这样我就不必为每个过滤器做3行 . 此外,不同“搜索”的矢量名称不遵循任何特定模式 .

谢谢! JCB

3 回答

  • 0

    您也可以保留以前的代码并使用 get

    在你的循环中,如果你替换

    sub = df[grepl(paste(allSearches[i],collapse="|"), df$Cars, ignore.case=T),]

    通过

    sub = df[grepl(paste(get(allSearches[i]),collapse="|"), df$Cars, ignore.case=T),]
    

    它应该工作 .

    for (i in 1:length(allSearches)){     
         sub = df[grepl(paste(get(allSearches[i]),collapse="|"), df$Cars, ignore.case=T),]
         sub[,allSearches[i]] <- "Yes"
         df = merge(df, sub, all.x = T)
     }
    
    > df[c(6:13,18:20,29),]
        mpg cyl  disp  hp drat    wt  qsec vs am gear carb             Cars SearchA Search1
    6  15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8    Maserati Bora    <NA>    <NA>
    7  15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3      Merc 450SLC    <NA>     Yes
    8  15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2      AMC Javelin    <NA>    <NA>
    9  15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2 Dodge Challenger    <NA>    <NA>
    10 15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4   Ford Pantera L    <NA>    <NA>
    11 16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3       Merc 450SE    <NA>     Yes
    12 17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3       Merc 450SL    <NA>     Yes
    13 17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4        Merc 280C    <NA>     Yes
    18 19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6     Ferrari Dino    <NA>    <NA>
    19 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4        Mazda RX4     Yes    <NA>
    20 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4    Mazda RX4 Wag     Yes    <NA>
    29 30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2      Honda Civic     Yes    <NA>
    
  • 0

    你也可以使用 Map

    df[allSearches] <-Map(function(x,y) 
      c('No', 'Yes')[grepl(x,y, ignore.case=TRUE)+1] , allSearches, list(df$Cars))
    

    更新

    如果需要 mergegroupsSeach 模式

    allSearches <- mget(ls(pattern='^Search'))
    res <- merge(df, Reduce(function(...) merge(..., all=TRUE),
        Map(function(x,y,z) {indx <-grepl(paste(x, collapse="|"), y,
                             ignore.case=TRUE)
                            sub<- df[indx,]
                            sub[z] <- 'Yes'
                            sub   } ,
           allSearches, list(df$Cars), names(allSearches))), 
                     all.x=TRUE)
    
    
     res[c(6:13,18:20,29),]
     #    mpg cyl  disp  hp drat    wt  qsec vs am gear carb             Cars Search1
     #6  15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8    Maserati Bora    <NA>
     #7  15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3      Merc 450SLC     Yes
     #8  15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2      AMC Javelin    <NA>
     #9  15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2 Dodge Challenger    <NA>
     #10 15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4   Ford Pantera L    <NA>
     #11 16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3       Merc 450SE     Yes
     #12 17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3       Merc 450SL     Yes
     #13 17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4        Merc 280C     Yes
     #18 19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6     Ferrari Dino    <NA>
     #19 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4        Mazda RX4    <NA>
     #20 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4    Mazda RX4 Wag    <NA>
     #29 30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2      Honda Civic    <NA>
     #   SearchA
     #6     <NA>
     #7     <NA>
     #8     <NA>
     #9     <NA>
     #10    <NA>
     #11    <NA>
     #12    <NA>
     #13    <NA>
     #18    <NA>
     #19     Yes
     #20     Yes
     #29     Yes
    

    数据

    df <- mtcars
    df$Cars <- rownames(df)
    
    SearchA = c("mazda","honda")
    Search1 = c("merc","toyota")
    
    allSearches = c(SearchA,Search1)
    
  • 0

    好的,这是你需要改变的 .

    df <- mtcars
    df$Cars <- rownames(df)
    
    SearchA = c("mazda","honda")
    Search1 = c("merc","toyota")
    
    allSearches = c("SearchA","Search1")
    
    for (i in 1:length(allSearches)){
        sub = df[grepl(paste(get(allSearches[i]), collapse="|"), df$Cars, ignore.case=T),]
    
        sub[,allSearches[i]] <- "Yes"
    
        df = merge(df, sub, all.x = T)
    
    }
    

    我唯一改变的是 paste(get(allSearches[i]), collapse="|") . 当您使用 get 时,它会尝试获取包含这些名称的向量

    最后你可以把:

    df[is.na(df)] <- "No"
    

相关问题