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

时间:2014-12-03 02:43:02

标签: r vector reference character paste

我试图在向量中使用字符串来调出另一个向量,以便在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],值=&#34;是&#34;):

     

替换有1行,数据有0

在尝试剖析问题时,我发现这个特定方法的问题在于&#34;粘贴&#34;功能在哪里......

  

糊(allSearches [1],崩溃=&#34; |&#34)

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

  

&#34; SearchA&#34;

而不是完整的载体

  

[1]&#34; mazda&#34; &#34;本田&#34;

非常感谢任何帮助。我正在处理很多&#34;搜索&#34;适合&#34;所有搜索&#34;所以在循环中获取所有内容会很好,这样我就不必为每个过滤器做3行。此外,不同的&#34;搜索&#34;的矢量名称;不要遵循任何特定的模式。

谢谢! JCB

3 个答案:

答案 0 :(得分: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"

答案 1 :(得分:0)

您也可以使用Map

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

更新

如果您需要merge groupsSeach个模式

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)

答案 2 :(得分: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>