Сравните столбец данных с другим столбцом данных

У меня есть столбец данных, содержащий пути к страницам (назовем его A):

pagePath
/text/other_text/123-string1-4571/text.html
/text/other_text/string2/15-some_other_txet.html
/text/other_text/25189-string3/45112-text.html
/text/other_text/text/string4/5418874-some_other_txet.html
/text/other_text/string5/text/some_other_txet-4157/text.html
/text/other_text/123-text-4571/text.html
/text/other_text/125-text-471/text.html

И у меня есть еще один столбец строкового фрейма данных, назовем его (B) (два фрейма данных разные, и у них не одинаковое количество строк).

Вот пример моего столбца в кадре данных B:

names
string1
string11
string4
string3
string2
string10
string5
string100

Что я хочу сделать, так это проверить, содержат ли мои пути к страницам (A) строки из моего другого фрейма данных (B).

У меня были трудности, потому что мои два кадра данных имеют разную длину, а данные неорганизованы.

ОЖИДАЕМЫЙ РЕЗУЛЬТАТ

Я хочу получить этот вывод в результате:

 pagePath                                                  names     exist
/text/other_text/123-string1-4571/text.html                string1   TRUE
/text/other_text/string2/15-some_other_txet.html           string2   TRUE
/text/other_text/25189-string3/45112-text.html             string3   TRUE
/text/other_text/text/string4/5418874-some_other_txet.html string4   TRUE
/text/string5/text/some_other_txet-4157/text.html          string5   TRUE
/text/other_text/123-text-4571/text.html                     NA      FALSE
/text/other_text/125-text-471/text.html                      NA      FALSE

Если мой вопрос нуждается в дополнительных разъяснениях, пожалуйста, укажите это.


person sarah    schedule 11.03.2016    source источник
comment
@mtoto Я хочу проверить, содержит ли мой столбец A данные из столбца B (данные в столбце A и столбце B не равны, но иногда столбец A содержит данные из столбца B)   -  person sarah    schedule 11.03.2016
comment
@sarah Я думаю, вам следует проверить функцию сопоставления в R.   -  person tushaR    schedule 11.03.2016
comment
пожалуйста, покажите пример B и ожидаемый результат.   -  person mtoto    schedule 11.03.2016
comment
@mtoto Я отредактировал свой вопрос и написал пример Б.   -  person sarah    schedule 11.03.2016
comment
спасибо, а что бы вы хотели получить на выходе?   -  person mtoto    schedule 11.03.2016
comment
@mtoto Я добавил желаемый ответ в вопрос, спасибо.   -  person sarah    schedule 11.03.2016
comment
спасибо, только последние две строки в вашем ожидаемом выводе сейчас не в примере A   -  person mtoto    schedule 11.03.2016
comment
@mtoto я исправил это :)   -  person sarah    schedule 11.03.2016


Ответы (4)


Мы можем сгенерировать столбец exist с помощью grepl()

# Collapse B$names into one string with "|" 
onestring <- paste(B$names, collapse = "|") 

# Generate new column
A$exist <- grepl(onestring, A$pagePath)
person mtoto    schedule 11.03.2016
comment
Я попробовал ваше решение, оно дало мне эту ошибку: Error in grepl(onestring, A$pagePath) : invalid regular expression. Я думаю, что это из-за того, что в реальных данных присутствует символ -. - person sarah; 11.03.2016
comment
убедитесь, что ваши столбцы относятся к классу character - person mtoto; 11.03.2016
comment
Теперь я столкнулся с другой ошибкой: `недопустимое регулярное выражение, причина Недостаточно памяти` - person sarah; 11.03.2016
comment
Насколько велики ваши данные? Тем не менее, он должен дать вам правильный вывод с опубликованными данными примера. - person mtoto; 11.03.2016
comment
имена составляют около 11000 строк, а пути к страницам - около 37000 :( - person sarah; 11.03.2016
comment
Да :( , я проверил это сейчас . - person sarah; 11.03.2016

Не очень приятно, так как содержит цикл for:

names <- rep(NA, length(A$pagePath))
exist <- rep(FALSE, length(A$pagePath))

for (name in B$names) {
  names[grep(name, A$pagePath)] <- name
  exist[grep(name, A$pagePath)] <- TRUE
}
person dotton    schedule 11.03.2016
comment
Спасибо @dotton, я пробую ваше решение. Если это нормально для моего случая, я попытаюсь преобразовать цикл в функцию применения :) - person sarah; 11.03.2016

Мы можем использовать str_extract_all из пакета stringr, но NA заменены на character(0), поэтому мы должны изменить его.

df$names <- as.character(str_extract_all(df$pagePath, "string[0-9]+"))
df$exist <- df$names %in% df1$names
df[df=="character(0)"] <- NA
df
#                                                 pagePath       names   exist
#1                  /text/other_text/123-string1-4571/text.html string1  TRUE
#2             /text/other_text/string2/15-some_other_txet.html string2  TRUE
#3               /text/other_text/25189-string3/45112-text.html string3  TRUE
#4   /text/other_text/text/string4/5418874-some_other_txet.html string4  TRUE
#5 /text/other_text/string5/text/some_other_txet-4157/text.html string5  TRUE
#6                     /text/other_text/123-text-4571/text.html    <NA> FALSE
#7                      /text/other_text/125-text-471/text.html    <NA> FALSE

ДАННЫЕ

dput(df)
structure(list(pagePath = structure(c(1L, 5L, 4L, 7L, 6L, 2L, 
3L), .Label = c("/text/other_text/123-string1-4571/text.html", 
"/text/other_text/123-text-4571/text.html", "/text/other_text/125-text-471/text.html", 
"/text/other_text/25189-string3/45112-text.html", "/text/other_text/string2/15-some_other_txet.html", 
"/text/other_text/string5/text/some_other_txet-4157/text.html", 
"/text/other_text/text/string4/5418874-some_other_txet.html"), class = "factor")), .Names = "pagePath", class = "data.frame", row.names = c(NA, 
-7L))
dput(df1)
structure(list(names = structure(c(1L, 4L, 7L, 6L, 5L, 2L, 8L, 
3L), .Label = c("string1", "string10", "string100", "string11", 
"string2", "string3", "string4", "string5"), class = "factor")), .Names = "names", class = "data.frame", row.names = c(NA, 
-8L))
person Sotos    schedule 11.03.2016
comment
моя проблема в том, что два столбца не имеют одинаковой длины - person sarah; 11.03.2016
comment
Это должно работать, хотя. Данные, которые я использовал, такие же, как и те, которыми вы поделились - person Sotos; 11.03.2016
comment
@sarah, также вы должны преобразовать свой фрейм данных в символ, поскольку наличие факторов для путей не имеет смысла. - person Sotos; 11.03.2016
comment
благодарю вас. Я попробую это и дам свой отзыв. - person sarah; 11.03.2016

Вот один из способов применения:

df$exist <- apply( df,1,function(x){as.logical(grepl(x[2],x[1]))} )
person David Heckmann    schedule 11.03.2016