在R的另一列中找到一列中的文本的数据框中查找行

时间:2018-07-20 20:27:35

标签: r dataframe grep

我想标识数据框中的行,在其中一列中的文本可以在另一列中找到。例如,在下面的数据框中,我想确定模型列中包含齿轮列中文本的行(在本例中为第1、2、7、8、32行)。

mydf <- cbind.data.frame(model=rownames(mtcars), gear=as.character(mtcars$gear), stringsAsFactors=F)
mydf

                 model gear
1            Mazda RX4    4
2        Mazda RX4 Wag    4
3           Datsun 710    4
4       Hornet 4 Drive    3
5    Hornet Sportabout    3
6              Valiant    3
7           Duster 360    3
8            Merc 240D    4
9             Merc 230    4
10            Merc 280    4
11           Merc 280C    4
12          Merc 450SE    3
13          Merc 450SL    3
14         Merc 450SLC    3
15  Cadillac Fleetwood    3
16 Lincoln Continental    3
17   Chrysler Imperial    3
18            Fiat 128    4
19         Honda Civic    4
20      Toyota Corolla    4
21       Toyota Corona    3
22    Dodge Challenger    3
23         AMC Javelin    3
24          Camaro Z28    3
25    Pontiac Firebird    3
26           Fiat X1-9    4
27       Porsche 914-2    5
28        Lotus Europa    5
29      Ford Pantera L    5
30        Ferrari Dino    5
31       Maserati Bora    5
32          Volvo 142E    4

似乎我应该能够结合使用grep或match或apply或map甚至ifelse之类的东西,但是我不太清楚。 (我当然可以进行for循环,但我有几百万行数据,并且不希望这样做。)

2 个答案:

答案 0 :(得分:1)

尝试一下:

mydf$flag = apply(mydf,1, function(x){grepl(x["gear"],x["model"])})

这将导致:

> head(mydf,20)
                 model gear  flag
1            Mazda RX4    4  TRUE
2        Mazda RX4 Wag    4  TRUE
3           Datsun 710    4 FALSE
4       Hornet 4 Drive    3 FALSE
5    Hornet Sportabout    3 FALSE
6              Valiant    3 FALSE
7           Duster 360    3  TRUE
8            Merc 240D    4  TRUE
9             Merc 230    4 FALSE
10            Merc 280    4 FALSE
11           Merc 280C    4 FALSE
12          Merc 450SE    3 FALSE
13          Merc 450SL    3 FALSE
14         Merc 450SLC    3 FALSE
15  Cadillac Fleetwood    3 FALSE
16 Lincoln Continental    3 FALSE
17   Chrysler Imperial    3 FALSE
18            Fiat 128    4 FALSE
19         Honda Civic    4 FALSE
20      Toyota Corolla    4 FALSE

答案 1 :(得分:1)

stringrtidyverse的一部分,具有grepl的矢量化实现:

library(tidyverse)
mydf %>% mutate(flag = str_detect(model,gear)) %>% head
#               model gear  flag
# 1         Mazda RX4    4  TRUE
# 2     Mazda RX4 Wag    4  TRUE
# 3        Datsun 710    4 FALSE
# 4    Hornet 4 Drive    3 FALSE
# 5 Hornet Sportabout    3 FALSE
# 6           Valiant    3 FALSE