Как сравнить список слов (chr) со значениями в нескольких столбцах в кадре данных и вывести двоичный ответ, если в R есть совпадение - PullRequest
1 голос
/ 05 июня 2019

Я хочу сравнить каждое отдельное слово в столбце words со значениями в столбцах V1 до V576 (по каждой строке для каждой строки). Если какое-либо слово из столбца words соответствует любому из слов в столбцах V , замените слово в соответствующем V столбец на 1 или еще на 0, если нет совпадений. Есть идеи как это сделать? Я не уверен, как это сделать по всем строкам и столбцам

Dataframe называется Data . Столбец words представляет собой список ($ words: List of 42201). Есть 42201 строк Есть около 576 столбцов слов для сравнения (от V1 до V576).

- это файл dput только для первых 3 строк и первых 20 столбцов.

structure(list(id = c("Te-1", "Te-2", "Te-3"), category = c("Fabric Care", 
"Fabric Care", "Home Care"), brand = c("Tide", "Tide", "Cascade"
), sub_category = c("Laundry", "Laundry", "Auto Dishwashing"), 
    market = c("US", "US", "US"), review_title = c("the best in a very crowded market", 
    "first time", "i have been using another well known brand and did not expect    "
    ), review_text = c("the best general wash detergent  convenient container that keeps the product driy ", 
    "this helped to clean our washing machine after getting it from someone else   this review was collected as part of a promotion  ", 
    "i have been using another well known brand and did not expect much difference  wow  was i ever mistaken  i will never go back "
    ), review_rating = c(5L, 5L, 5L), words = list(c("the", "best", 
    "general", "wash", "deterg", "conveni", "contain", "that", 
    "keep", "the", "product", "driy"), c("this", "help", "to", 
    "clean", "our", "wash", "machin", "after", "get", "it", "from", 
    "someon", "els", "this", "review", "was", "collect", "as", 
    "part", "of", "a", "promot"), c("i", "have", "been", "use", 
    "anoth", "well", "known", "brand", "and", "did", "not", "expect", 
    "much", "differ", "wow", "was", "i", "ever", "mistaken", 
    "i", "will", "never", "go", "back")), V1 = c("absolut", "absolut", 
    "absolut"), V2 = c("action", "action", "action"), V3 = c("actionpac", 
    "actionpac", "actionpac"), V4 = c("actual", "actual", "actual"
    ), V5 = c("addit", "addit", "addit"), V6 = c("adverti", "adverti", 
    "adverti"), V7 = c("afford", "afford", "afford"), V8 = c("agent", 
    "agent", "agent"), V9 = c("allerg", "allerg", "allerg"), 
    V10 = c("allergi", "allergi", "allergi"), V11 = c("alon", 
    "alon", "alon")), row.names = c(NA, -3L), class = c("data.table", 
"data.frame"), .internal.selfref = <pointer: 0x0000023d166a1ef0>)

Пожалуйста, посмотрите ниже фрагмент того, как выглядит фрейм данных, чтобы лучше понять мой вопрос

CLICK HERE TO SEE THE DATA TABLE

Большое спасибо за помощь!

Ответы [ 3 ]

0 голосов
/ 05 июня 2019

И в дополнение к tidyverse-решению @Johan Rosa, здесь есть решение, которое работает с base-R:

ls <- lapply(1:nrow(yourFrame), function(row){
  out <- as.numeric(yourFrame[row,] %in% unlist(yourFrame[row,'words']))
  names(out) <- names(yourFrame)
  return(out)
})
df <- data.frame(do.call(rbind, ls))

lapply -колл перебирает каждую строку ваших данных.frame и создает логический вектор для каждого из них, определяя, можно ли снова найти слово-вектор соответствующей строки, сохраняя имена столбцов ранее.Последний вызов просто склеивает все вместе.

0 голосов
/ 05 июня 2019

Я создал фрейм данных

данные

data <- data.frame(words = c("the, best, general","i, have, been"), v1 = c("best","no"), v2 = c("have", "nothing"), stringsAsFactors = F)

Используя для условия цикла, я передал функции grepl, где бы она ни находилась, появляется 1, если не 0

for (i in 2: ncol(data)){
  for (j in 1:nrow(data)){

  x <- i

  y <- data$words[j]

  ab <- data [j,x]

   abc <- grepl (ab , y)

   data[j,i] <- ifelse (abc %in% "TRUE", 1, data[j,i])

  }
}

результат

print (data)
        words       v1     v2
the, best, general  1      0
   i, have, been    0      0
0 голосов
/ 05 июня 2019

Чтобы показать вам, как создать представление вашей проблемы, я создал новый пример ваших данных и предоставил код, используя tidyverse, который, я думаю, ответит на ваш вопрос.

library(tidyverse)

df <- data.frame(
  words = c("I want to compare each individual word in the words",
            "column to the values in columns V1 to V576",
            ". If any word from the words column matches any",
            "replace the word in the respective V column by 1 or else"),
  v1 = c("want", "want", "want", "want"),
  v2 = c("word", "word", "word", "word"),
  v3 = c("any", "any", "any", "any")
  )





df %>%
  gather(key = key, value = value, -words) %>%
  mutate(appear = as.numeric(str_detect(words, value))) %>%
  select(-value) %>%
  spread(key, appear)

выход

                                                     words v1 v2 v3
1          . If any word from the words column matches any  0  1  1
2               column to the values in columns V1 to V576  0  0  0
3      I want to compare each individual word in the words  1  1  0
4 replace the word in the respective V column by 1 or else  0  1  0
...