Создайте значение столбца на основе соответствующего регулярного выражения

У меня есть следующая строка символов в столбце «Предложения» для df:

I like an apple

Я хотел бы создать второй столбец с именем Type, значения которого определяются совпадающими строками. Я хотел бы взять регулярное выражение \bapple\b, сопоставить его с предложением и, если оно совпадает, добавить значение Fruit_apple в столбец Type.

В конечном итоге я хотел бы сделать это с несколькими другими строками и типами.

Есть ли простой способ сделать это с помощью функции?

набор данных (опрос_1):

structure(list(slider_8.response = c(1L, 1L, 3L, 7L, 7L, 7L, 
1L, 3L, 2L, 1L, 1L, 7L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 6L, 1L, 7L, 
7L, 7L, 1L, 1L, 7L, 6L, 6L, 1L, 1L, 7L, 1L, 7L, 7L, 1L, 7L, 7L, 
7L, 7L, 7L, 6L, 7L, 7L, 7L, 1L, 1L, 6L, 1L, 1L, 1L, 1L, 7L, 2L
), Sentences = c("He might could do it.", "I ever see the film.", 
"I may manage to come visit soon.", "She’ll never be forgotten.", 
"They might find something special.", "It might not be a good buy.", 
"Maybe my pain will went away.", "Stephen maybe should fix your bicycle.", 
"It used to didnʼt matter if you walked in late.", "He’d could climb the stairs.", 
"Only Graeme would might notice that.", "I used to cycle a lot. ", 
"Your dad belongs to disagree with this. ", "We can were pleased to see her.", 
"He may should take us to the city.", "I could never forgot his deep voice.", 
"I should can turn this thing over to Ann.", "They must knew who they really are.", 
"We used to runs down three flights.", "I don’t care what he may be up to. ", 
"That’s something I ain’t know about.", "That must be quite a skill.", 
"We must be able to invite Jim.", "She used to play with a trolley.", 
"He is done gone. ", "You might can check this before making a decision.", 
"It would have a positive effect on the team. ", "Ruth can maybe look for it later.", 
"You should tag along at the dance.", "They’re finna leave town.", 
"A poem should looks like that.", "I can tell you didn’t do your homework. ", 
"I can driving now.", "They should be able to put a blanket over it.", 
"We could scarcely see each other.", "I might says I was never good at maths.", 
"The next dance will be a quickstep. ", "I might be able to find myself a seat in this place.", 
"Andrew thinks we shouldn’t do it.", "Jack could give a hand.", 
"She’ll be able to come to the event.", "She’d maybe keep the car the way it is.", 
"Sarah used to be able to agree with this proposal.", "I’d like to see your lights working. ", 
"I’d be able to get a little bit more sleep.", "John may has a second name.", 
"You must can apply for this job.", "I maybe could wait till the 8 o’clock train.", 
"She used to could go if she finished early.", "That would meaned something else, eh?", 
"You’ll can enjoy your holiday.", "We liketa drowned that day. ", 
"I must say it’s a nice feeling.", "I eaten my lunch."), construct = c(NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 
NA, NA, NA, NA, NA)), row.names = c(NA, 54L), class = "data.frame")

список_типов:

list("DM_will_can"=c("ll can","will can"), "DM_would_could"=c("d could","would could"),
                  "DM_might_can" = "might can","DM_might_could" = "might could","DM_used_to_could" = "used to could",
                  "DM_should_can" = "should can","DM_would_might"=c("d might", "would might"),"DM_may_should" = "may should",
                  "DM_must_can" = "must can", "SP_will_be_able"=c("ll be able","will be able"),
                  "SP_would_be_able"=c("d be able","would be able"),"SP_might_be_able" = "might be able",
                  "SP_maybe_could" = "maybe could","SP_used_to_be_able" = "used to be able","SP_should_be_able"=
                    "should be able","SP_would_maybe"=c("d maybe", "would maybe"), "SP_maybe_should" = "maybe should",
                  "SP_must_be_able" = "must be able", "Filler_will_a" = "quickstep","Filler_will_b" = "forgotten",
                  "Filler_would_a" = "lights working","Filler_would_b" = "positive effect","Filler_can_a" = "homework",
                  "Filler_can_b" = "Ruth","Filler_could_a" = "scarcely","Filler_could_b" = "Jack", "Filler_may_a" = "may be up to",
                  "Filler_may_b" = "visit soon", "Filler_might_a" = "good buy","Filler_might_be" = "something special",
                  "Filler_should_a" = "tag along","Filler_should_b" = "Andrew","Filler_used_to_a" = "trolley",
                  "Filler_used_to_b" = "cycle a lot","Filler_must_a" = "quite a skill","Filler_must_b" = "nice feeling",
                  "Dist_gram_will_went" = "will went","Dist_gram_meaned" = "meaned","Dist_gram_can_were" = "can were",
                  "Dist_gram_forgot" = "never forgot", "Dist_gram_may_has" = "may has", 
                  "Dist_gram_might_says" = "might says","Dist_gram_used_to_runs" = "used to runs",
                  "Dist_gram_should_looks" = "should looks","Dist_gram_must_knew" = "must knew","Dist_dial_liketa" = "liketa",
                  "Dist_dial_belongs" = "belongs to disagree","Dist_dial_finna" = "finna","Dist_dial_used_to_didnt" = "used to didn't matter",
                  "Dist_dial_eaten" = "I eaten", "Dist_dial_can_driving" = "can driving","Dist_dial_aint_know" = "That's something",
                  "Dist_dial_ever_see" = "ever see the film","Dist_dial_done_gone" = "done gone")

Есть много способов сделать это. Разумный тип и уровень абстракции зависят от того, что вы ожидаете от типов и сколько совпадающих строк для каждого типа, т.е. трудно ответить на этот вопрос без достаточной дополнительной информации.

SamR 06.04.2022 15:05

Извините, я понимаю, что мой вопрос немного расплывчатый. Я постараюсь уточнить. У меня будет конечное количество Sentences для аннотирования, с 54 различными Type уровнями и максимум 2 совпадающими строками на Type уровень. В основном я пытаюсь автоматизировать процесс аннотации, а не делать это вручную для каждого предложения. Это делает мой вопрос немного яснее? Всего наилучшего, Кэмерон

Cameron 06.04.2022 15:09
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
49
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я хочу сделать это со словарем Python, но мы говорим о R, поэтому я более или менее перевел этот подход. Вероятно, есть более идиоматический способ сделать это в R, чем два цикла for, но это должно работать:

# Define data
df <- data.frame(
    id = c(1:5),
    sentences = c("I like apples", "I like dogs", "I have cats", "Dogs are cute", "I like fish")
)

#   id     sentences
# 1  1 I like apples
# 2  2   I like dogs
# 3  3   I have cats
# 4  4 Dogs are cute
# 5  5   I like fish

type_list <- list(
    "fruit" = c("apples", "oranges"),
    "animals" = c("dogs", "cats")
)

types <- names(type_list)

df$type <- NA
df$item <- NA

for (type in types) {
    for (item in type_list[[type]]) {
        matches <- grep(item, df$sentences, ignore.case = TRUE)
        df[matches, "type"]  = type
        df[matches, "item"]  = item
    }
}


# Output:
#   id     sentences    type   item
# 1  1 I like apples   fruit apples
# 2  2   I like dogs animals   dogs
# 3  3   I have cats animals   cats
# 4  4 Dogs are cute animals   dogs
# 5  5   I like fish    <NA>   <NA>

РЕДАКТИРОВАТЬ

Добавлено после добавления данных. Если я прочитаю ваши данные и назову их df, а ваш список типов и назову их type_list, то получится следующее:


types <- names(type_list)

df$type <- NA
df$item <- NA

for (type in types) {
    for (item in type_list[[type]]) {
        matches <- grep(item, df$Sentences, ignore.case = TRUE)
        df[matches, "type"]  = type
        df[matches, "item"]  = item
    }
}

Это точно так же, как мой предыдущий код, за исключением того, что Sentences имеет S в верхнем регистре в вашем фрейме данных.

Большое спасибо, Сэм. Адаптирую это к моим данным и дам вам знать, как это происходит.

Cameron 06.04.2022 15:29

Нет проблем - я немного обновил его, чтобы создать столбцы NA, а не пустые векторы символов. Не уверен, почему я сделал это по-другому, это определенно хуже.

SamR 06.04.2022 15:36

Привет Сэм, я столкнулся с парой проблем при адаптации твоего кода. Я отредактировал свой пост, чтобы показать вам наборы данных, с которыми я имею дело. Я думаю, что сделал ошибку в цикле for, вы знаете, что может быть причиной этого?

Cameron 06.04.2022 16:01

Я не вижу изменений в вашем исходном сообщении.

SamR 06.04.2022 16:03

Да, я изо всех сил пытаюсь внести изменения, редактор отказывается позволить мне сохранить их из-за проблем с форматированием кода.

Cameron 06.04.2022 16:13

Только что добавил свои наборы данных. И вот цикл, который я использовал (не смог добавить его в свой пост): код цикла for: types <-names(type_list) for (construct in types) {matchs <- grep(construct, Survey_1$Sentences, ignore.case = TRUE) Survey_1[соответствует, "конструировать"] = построить }

Cameron 06.04.2022 16:16

Правильно - разница теперь, когда вы разместили свои образцы данных, заключается в том, что я использовал именованный список "fruit" = c("apples", "oranges"), а вы нет, т.е. у вас нет элементов, а также типов. Код не будет работать, если ввод не будет в том же формате.

SamR 06.04.2022 16:31

Да, я ожидал этого и думал, что удаление слоя кода из цикла может помочь, но это не так. Я использовал тот же формат, что и вы, для списка, но у меня нет типов и элементов — только одноуровневые типы и варианты строк, соответствующие каждому из них. Требует ли это перезаписи списка типов и цикла for?

Cameron 06.04.2022 16:35

Только что понял, что я не дал вам правильную type_list структуру в своих правках. Просто изменил это снова, извините за путаницу.

Cameron 06.04.2022 16:37

Смотрите мое редактирование - единственная разница, которую я вижу, заключается в том, что Sentences имеет заглавную букву S.

SamR 06.04.2022 16:46

Да собирался сказать вам, что мне удалось заставить его работать идеально. Большое спасибо за ваше терпение!

Cameron 06.04.2022 16:46

Рад, что это сработало!

SamR 06.04.2022 16:54

Другие вопросы по теме