查找字符串是否包含在R中的另一个字符串中

时间:2017-12-14 14:24:55

标签: r string loops if-statement

我试图找到一个字符串是否包含在另一个数据帧中的另一个字符串中。我正在使用if语句和for循环,我想保持结构,因为我有它但只是找不到正确的语法使用。 我的第一个数据框的一个例子是:

Route1
x y z
w x f z 
a b c
x y z

我的第二个数据框的一个例子是:

Route2      Track
x y z        A
v w x f z    B
a b          C

一旦我发现路由2中是否包含Route1,我想为路由1分配相应的路径。因此,数据帧1的最终数据帧应为:

Route1   CalculatedTrack
x y z     A
w x f z   B
a b
x y z     A

我目前的公式是:

for (i in 1:nrow(df1)){
  for (j in 1:nrow(df2)){
    if((((grepl(df1$Route1[i], df2$Route2[j],perl = TRUE)==TRUE){
      df1$CalculatedTrack<-df2$Track[j]
    }
  }
}

因此,我想遍历每一行,看看Route1是否在Route2中。请注意,我在每个数据框中都有多个列。

感谢您的帮助

3 个答案:

答案 0 :(得分:1)

在data.table语法中,我们可以这样做:

library(data.table)
setDT(df1)
setDT(df2)
df1[, Track := df1[, df2[grepl(Route1, df2$Route2), Track[1]], 1:NROW(df1)][,V1]]

请注意,如果找到任何行的多个Track匹配,则假定将使用第一个匹配

答案 1 :(得分:0)

有点hacky解决方案,但仍然有效

library(tidyverse)

df1 <- tribble(
  ~route1,
  "x y z",
  "w x f z",
  "a b c",
  "x y z"
)

find_route_match <- function(string, df2){
  df2[str_detect(df2$route2, string), 2] %>% as.character()
}

df2 <- tribble(
  ~route2,        ~track,
  "x y z",        "A",
  "v w x f z",    "B",
  "a b",          "C"
)

df1 %>% 
  mutate(match = map(route1, find_route_match, df2)) %>% 
  unnest()

产生以下输出:

# A tibble: 4 x 2
   route1        match
    <chr>        <chr>
1   x y z            A
2 w x f z            B
3   a b c character(0)
4   x y z            A

答案 2 :(得分:0)

也许你可以试试fuzzyjoin包裹:

library(fuzzyjoin)

regex_right_join(df2, df1, by = c(Route2 = 'Route1'))
#      Route2 Track  Route1
# 1     x y z     A   x y z
# 2 v w x f z     B w x f z
# 3      <NA>  <NA>   a b c
# 4     x y z     A   x y z

可重复数据:

df1 <- structure(list(Route1 = c("x y z", "w x f z", "a b c", "x y z"
)), .Names = "Route1", class = "data.frame", row.names = c(NA, -4L))

df2 <- structure(list(Route2 = c("x y z", "v w x f z", "a b"), Track = c("A",
"B", "C")), .Names = c("Route2", "Track"), row.names = c(NA,
-3L), class = "data.frame")

df1
#    Route1
# 1   x y z
# 2 w x f z
# 3   a b c
# 4   x y z

df2
#      Route2 Track
# 1     x y z     A
# 2 v w x f z     B
# 3       a b     C