R - вернуть индексы строк, используя grepl - PullRequest
0 голосов
/ 14 ноября 2018

Я хотел бы вернуть индекс строки для совпадения текста.Сопоставление текста выполняется с помощью функции adist в R.Код создает некоторые текстовые данные, вычисляет расстояния редактирования и возвращает 5 лучших совпадений.

name <- c("holiday inn", "geico", "zgf", "morton phillips")
address <- c("400 lafayette pl tupelo ms", "227 geico plaza chevy chase md", 
"811 quincy st washington dc", "1911 1st st rockville md")

source1 <- data.frame(name, address)

 name <- c("williams sonoma", "mamas bbq", "davis polk", "hop a long 
diner","joes crag shack", "mike lowry place", "holiday inn", "zummer")

name2 <- c(NA, NA, NA, NA, NA, NA, "hi express", "zummer gunsul frasca")
address <- c("2 reads way new castle de", "248 w 4th st newark de",
 "1100 21st st nw washington dc", "1804 w 5th st wilmington de",
 "1208 kenwood parkway holdridge nb", "4203 ocean drive miami fl",
 "400 lafayette pl tupelo ms", "811 quincy st washington dc")
source2 <- data.frame(name, name2, address)

#calculate edit distance for name and address
dist.mat.nm <- adist(source1$name, source2$name, partial = T, ignore.case = TRUE)
dist.mat.ad <- adist(source1$address, source2$address, partial = TRUE, ignore.case = TRUE)

#assemble data frame
imat <- apply(dist.mat.nm, 1, order)[1:5, ]
top.nm <- data.frame(name = source1$name)
tmp <- apply(imat, 1, function(i) source2$name[i])
colnames(tmp) <- paste("top", 1:5, sep = ".")
top.nm <- cbind(top.nm, tmp)

imat <- apply(dist.mat.ad, 1, order)[1:5, ]
top.ad <- data.frame(address = source1$address)
tmp <- apply(imat, 1, function(i) source2$address[i])
colnames(tmp) <- paste("top", 1:5, sep = ".")
top.ad <- cbind(top.ad, tmp)

Что я хотел бы сделать, это: 1. для каждого столбца top.nm и top.ad добавитьстолбец index.match для индекса строки, в которой найдено совпадение, и 2. добавьте столбец distance, содержащий расстояние редактирования для этого совпадения (т. е. значение adist).

Итак, для top.nm.1, столбец index.match будет: c(7, 6, 4, 1).

Я пытался использовать which(grepl(paste(source1$name, collapse = "|"), source2$name, fixed = F)) для возврата индексов строк, но по какой-то причине он возвращает только одно значение, а не целый вектор.Буду признателен за любую помощь или совет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...