我想标识数据框中的行,在其中一列中的文本可以在另一列中找到。例如,在下面的数据框中,我想确定模型列中包含齿轮列中文本的行(在本例中为第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循环,但我有几百万行数据,并且不希望这样做。)
答案 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)
stringr
是tidyverse
的一部分,具有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