我试图在向量中使用字符串来调出另一个向量,以便在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
答案 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
groups
个Seach
个模式
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>