У меня есть следующая строка символов в столбце «Предложения» для 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")
Извините, я понимаю, что мой вопрос немного расплывчатый. Я постараюсь уточнить. У меня будет конечное количество Sentences
для аннотирования, с 54 различными Type
уровнями и максимум 2 совпадающими строками на Type
уровень. В основном я пытаюсь автоматизировать процесс аннотации, а не делать это вручную для каждого предложения. Это делает мой вопрос немного яснее? Всего наилучшего, Кэмерон
Я хочу сделать это со словарем 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 в верхнем регистре в вашем фрейме данных.
Большое спасибо, Сэм. Адаптирую это к моим данным и дам вам знать, как это происходит.
Нет проблем - я немного обновил его, чтобы создать столбцы NA, а не пустые векторы символов. Не уверен, почему я сделал это по-другому, это определенно хуже.
Привет Сэм, я столкнулся с парой проблем при адаптации твоего кода. Я отредактировал свой пост, чтобы показать вам наборы данных, с которыми я имею дело. Я думаю, что сделал ошибку в цикле for, вы знаете, что может быть причиной этого?
Я не вижу изменений в вашем исходном сообщении.
Да, я изо всех сил пытаюсь внести изменения, редактор отказывается позволить мне сохранить их из-за проблем с форматированием кода.
Только что добавил свои наборы данных. И вот цикл, который я использовал (не смог добавить его в свой пост): код цикла for: types <-names(type_list) for (construct in types) {matchs <- grep(construct, Survey_1$Sentences, ignore.case = TRUE) Survey_1[соответствует, "конструировать"] = построить }
Правильно - разница теперь, когда вы разместили свои образцы данных, заключается в том, что я использовал именованный список "fruit" = c("apples", "oranges")
, а вы нет, т.е. у вас нет элементов, а также типов. Код не будет работать, если ввод не будет в том же формате.
Да, я ожидал этого и думал, что удаление слоя кода из цикла может помочь, но это не так. Я использовал тот же формат, что и вы, для списка, но у меня нет типов и элементов — только одноуровневые типы и варианты строк, соответствующие каждому из них. Требует ли это перезаписи списка типов и цикла for?
Только что понял, что я не дал вам правильную type_list
структуру в своих правках. Просто изменил это снова, извините за путаницу.
Смотрите мое редактирование - единственная разница, которую я вижу, заключается в том, что Sentences
имеет заглавную букву S.
Да собирался сказать вам, что мне удалось заставить его работать идеально. Большое спасибо за ваше терпение!
Рад, что это сработало!
Есть много способов сделать это. Разумный тип и уровень абстракции зависят от того, что вы ожидаете от типов и сколько совпадающих строк для каждого типа, т.е. трудно ответить на этот вопрос без достаточной дополнительной информации.