Reputation: 119
I have a dataset that contains a variable called "sentence", which contains sentences. Here is a reproducible small version of it
structure(list(section = c("id111", "id111", "id111", "id111",
"id111", "id111", "id111", "id111", "id111", "id111", "id111",
"id111", "id111", "id111", "id111"), sentence = c("Es wird Abschied genommen, aber auf Wiedersehen Die Großmama hatte einen Tag vor ihrer Ankunft noch einen Brief nach der Alp hinauf geschrieben, damit sie oben bestimmt wüßten, daß sie komme.",
"Diesen Brief brachte am andern Tage der Peter in der Frühe mit sich, als er auf die Weide zog.",
"Schon war der Großvater mit den Kindern aus der Hütte getreten, und auch Schwänli und Bärli standen beide draußen und schüttelten lustig ihre Köpfe in der frischen Morgenluft, während die Kinder sie streichelten und ihnen glückliche Reise wünschten zu ihrer Bergfahrt.",
"Behaglich stand der Öhi dabei und schaute bald auf die frischen Gesichter der Kinder, bald auf seine sauber glänzenden Geißen nieder.",
"Beides mußte ihm gefallen, denn er lächelte vergnüglich.",
"Jetzt kam der Peter heran.", "Als er die Gruppe gewahr wurde, näherte er sich langsam, streckte den Brief dem Öhi entgegen, und sobald dieser ihn erfaßt hatte, sprang er scheu zurück, so als ob ihn etwas erschreckt habe, und dann guckte er schnell hinter sich, gerade als ob von hinten ihn auch noch etwas hätte erschrecken wollen; dann machte er einen Sprung und lief davon, den Berg hinauf.",
"»Großvater«, sagte das Heidi, das dem Vorgang verwundert zugeschaut hatte, »warum tut der Peter jetzt immer wie der große Türk, wenn der eine Rute hinter sich merkt; dann scheut er mit dem Kopf und schüttelt ihn nach allen Seiten und macht auf einmal Sprünge in die Luft hinauf.«",
"»Vielleicht merkt der Peter auch eine Rute hinter sich, die er verdient«, antwortete der Großvater.",
"Nur die erste Halde hinauf lief der Peter so in einem Zuge davon; sobald man ihn von unten nicht mehr sehen konnte, kam es anders.",
"Da stand er still und drehte scheu den Kopf nach allen Seiten.",
"Plötzlich tat er einen Sprung und schaute hinter sich, so erschreckt, als habe ihn eben einer im Genick gepackt.",
"Hinter jedem Busch hervor, aus jeder Hecke heraus meinte jetzt der Peter den Polizeidiener aus Frankfurt auf sich losstürzen zu sehen.",
"Je länger aber diese gespannte Erwartung dauerte, je schreckhafter wurde es dem Peter zumute, er hatte keinen ruhigen Augenblick mehr.",
"Nun mußte das Heidi seine Hütte aufräumen, denn die Großmama sollte doch alles in guter Ordnung finden, wenn sie kam."
), type = c("chapter", "chapter", "chapter", "chapter", "chapter",
"chapter", "chapter", "chapter", "chapter", "chapter", "chapter",
"chapter", "chapter", "chapter", "chapter"), ch_n = c(1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), book = structure(c(1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("book1",
"book2"), class = "factor"), sentence_id = 1:15, freq = c(1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L)), row.names = c(NA,
-15L), groups = structure(list(sentence = c("»Großvater«, sagte das Heidi, das dem Vorgang verwundert zugeschaut hatte, »warum tut der Peter jetzt immer wie der große Türk, wenn der eine Rute hinter sich merkt; dann scheut er mit dem Kopf und schüttelt ihn nach allen Seiten und macht auf einmal Sprünge in die Luft hinauf.«",
"»Vielleicht merkt der Peter auch eine Rute hinter sich, die er verdient«, antwortete der Großvater.",
"Als er die Gruppe gewahr wurde, näherte er sich langsam, streckte den Brief dem Öhi entgegen, und sobald dieser ihn erfaßt hatte, sprang er scheu zurück, so als ob ihn etwas erschreckt habe, und dann guckte er schnell hinter sich, gerade als ob von hinten ihn auch noch etwas hätte erschrecken wollen; dann machte er einen Sprung und lief davon, den Berg hinauf.",
"Behaglich stand der Öhi dabei und schaute bald auf die frischen Gesichter der Kinder, bald auf seine sauber glänzenden Geißen nieder.",
"Beides mußte ihm gefallen, denn er lächelte vergnüglich.",
"Da stand er still und drehte scheu den Kopf nach allen Seiten.",
"Diesen Brief brachte am andern Tage der Peter in der Frühe mit sich, als er auf die Weide zog.",
"Es wird Abschied genommen, aber auf Wiedersehen Die Großmama hatte einen Tag vor ihrer Ankunft noch einen Brief nach der Alp hinauf geschrieben, damit sie oben bestimmt wüßten, daß sie komme.",
"Hinter jedem Busch hervor, aus jeder Hecke heraus meinte jetzt der Peter den Polizeidiener aus Frankfurt auf sich losstürzen zu sehen.",
"Je länger aber diese gespannte Erwartung dauerte, je schreckhafter wurde es dem Peter zumute, er hatte keinen ruhigen Augenblick mehr.",
"Jetzt kam der Peter heran.", "Nun mußte das Heidi seine Hütte aufräumen, denn die Großmama sollte doch alles in guter Ordnung finden, wenn sie kam.",
"Nur die erste Halde hinauf lief der Peter so in einem Zuge davon; sobald man ihn von unten nicht mehr sehen konnte, kam es anders.",
"Plötzlich tat er einen Sprung und schaute hinter sich, so erschreckt, als habe ihn eben einer im Genick gepackt.",
"Schon war der Großvater mit den Kindern aus der Hütte getreten, und auch Schwänli und Bärli standen beide draußen und schüttelten lustig ihre Köpfe in der frischen Morgenluft, während die Kinder sie streichelten und ihnen glückliche Reise wünschten zu ihrer Bergfahrt."
), .rows = structure(list(8L, 9L, 7L, 4L, 5L, 11L, 2L, 1L, 13L,
14L, 6L, 15L, 10L, 12L, 3L), ptype = integer(0), class = c("vctrs_list_of",
"vctrs_vctr", "list"))), row.names = c(NA, 15L), class = c("tbl_df",
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df",
"tbl_df", "tbl", "data.frame"))
I then have a list of words, below a reduced version:
structure(list(word = c("Ära", "Arsenfahlerz", "Arsenikbleispath",
"Arsensaures", "Blei", "Aufschiebung", "Ausliegerberg", "Baltischer",
"Schild", "Bänderton", "Bändertondatierung", "Bändertonkalender",
"Beben", "Bebenherd", "Belgit", "Hüttenwesen", "Bergbau", "Bergkamm",
"Bergmassiv", "Bergmehl", "Bergsporn", "Bergstock", "Binnit",
"Biostratigrafie", "Biostratigraphie", "Blattsilikat", "Blattverschiebung",
"Bleiapatit", "Block", "Blutjaspis", "Bodenerhebung", "Bodenkunde",
"Bodenwissenschaft", "Böhmische", "Masse", "Böhmisches", "Hochland",
"Massiv", "Bolus", "Alba", "Bongo", "Berge", "Braunauer", "Wände",
"Braunbleierz", "Brauner", "Glaskopf", "Jura", "Braunjura", "Bruch",
"Bruchflügel", "Bruchlinie", "Bruchschollentektonik", "Bruchtektonik",
"Buckel", "Budweis", "Wittingauer", "Tiefplatte", "Bühel", "Bühl",
"Buntbleierz", "Calciovolborthit", "Calciumcarbonat", "Calciumkarbonat",
"Calciumsulfat", "Cassiterit", "Celit", "Cevennen", "Chalcedon",
"Chalkosin", "Chalzedon", "Chilenische", "Schweiz", "Chronostratigrafie",
"Chronostratigraphie", "Coltan", "Columbeisen", "Columbit", "Conichalcit",
"Danakil", "Deflation", "Depression", "Desertation", "Desertifikation",
"Diatomeenerde", "Diatomeenpelit", "Diatomit", "Diatrema", "Dislokation",
"Dolomit", "Dolomitstein", "Donau", "Iller", "Lech", "dunkles",
"Fahlerz", "Durchschlagsröhre", "Edaphologie", "Eem", "Interglazial",
"Warmzeit", "Effusivgestein", "einfache", "Scherung", "Einzugsgebiet",
"Eisenerz", "Eisenkies", "Eisensulfid", "Eisvulkan", "Eiszeit",
"Eiszeitalter", "Endmoräne", "endogene", "Dynamik", "Prozesse",
"Entwässerungsgebiet", "Epirogenese", "Epizentrum", "Erdbeben",
"Erdbebenforscher", "Erdbebenschwarm", "Erdbebenwarte", "Erdbebenwelle",
"Erdbebenzentrum", "Erdkruste", "Erdrinde", "Erdstoß", "Erdzeitalter",
"Ergussgestein", "Erhebung", "Erhöhung", "Erosion", "Erratiker",
"erratischer", "Eruptionsschlot", "Eruptivgestein", "Erz", "Expansionshypothese",
"Extrusivgestein", "Falkengebirge", "Faulschlamm", "Fels", "Felsblock",
"Felsburg", "Felsen", "Felsenkunde", "Felsmechanik", "Felsnadel",
"Felsnase", "Felssporn", "Felsturm")), row.names = c(NA, -151L
), class = c("tbl_df", "tbl", "data.frame"))
How do I add a column to my first dataset, such as that it will be called "geo" and it will say "yes" to each sentence, if ANY of the words in the second dataset appears in the sentence, and "no" if not?
Upvotes: 0
Views: 84
Reputation: 5788
Base R solution:
df$geo <- Vectorize(grepl)(paste0(" ", tolower(search_words), " "),
gsub("[[:punct:]]", " ", tolower(df$sentence)))
Data:
df <- structure(list(section = c("id111", "id111", "id111", "id111",
"id111", "id111", "id111", "id111", "id111", "id111", "id111",
"id111", "id111", "id111", "id111"), sentence = c("Es wird Abschied genommen, aber auf Wiedersehen Die Großmama hatte einen Tag vor ihrer Ankunft noch einen Brief nach der Alp hinauf geschrieben, damit sie oben bestimmt wüßten, daß sie komme.",
"Diesen Brief brachte am andern Tage der Peter in der Frühe mit sich, als er auf die Weide zog.",
"Schon war der Großvater mit den Kindern aus der Hütte getreten, und auch Schwänli und Bärli standen beide draußen und schüttelten lustig ihre Köpfe in der frischen Morgenluft, während die Kinder sie streichelten und ihnen glückliche Reise wünschten zu ihrer Bergfahrt.",
"Behaglich stand der Öhi dabei und schaute bald auf die frischen Gesichter der Kinder, bald auf seine sauber glänzenden Geißen nieder.",
"Beides mußte ihm gefallen, denn er lächelte vergnüglich.",
"Jetzt kam der Peter heran.", "Als er die Gruppe gewahr wurde, näherte er sich langsam, streckte den Brief dem Öhi entgegen, und sobald dieser ihn erfaßt hatte, sprang er scheu zurück, so als ob ihn etwas erschreckt habe, und dann guckte er schnell hinter sich, gerade als ob von hinten ihn auch noch etwas hätte erschrecken wollen; dann machte er einen Sprung und lief davon, den Berg hinauf.",
"»Großvater«, sagte das Heidi, das dem Vorgang verwundert zugeschaut hatte, »warum tut der Peter jetzt immer wie der große Türk, wenn der eine Rute hinter sich merkt; dann scheut er mit dem Kopf und schüttelt ihn nach allen Seiten und macht auf einmal Sprünge in die Luft hinauf.«",
"»Vielleicht merkt der Peter auch eine Rute hinter sich, die er verdient«, antwortete der Großvater.",
"Nur die erste Halde hinauf lief der Peter so in einem Zuge davon; sobald man ihn von unten nicht mehr sehen konnte, kam es anders.",
"Da stand er still und drehte scheu den Kopf nach allen Seiten.",
"Plötzlich tat er einen Sprung und schaute hinter sich, so erschreckt, als habe ihn eben einer im Genick gepackt.",
"Hinter jedem Busch hervor, aus jeder Hecke heraus meinte jetzt der Peter den Polizeidiener aus Frankfurt auf sich losstürzen zu sehen.",
"Je länger aber diese gespannte Erwartung dauerte, je schreckhafter wurde es dem Peter zumute, er hatte keinen ruhigen Augenblick mehr.",
"Nun mußte das Heidi seine Hütte aufräumen, denn die Großmama sollte doch alles in guter Ordnung finden, wenn sie kam."
), type = c("chapter", "chapter", "chapter", "chapter", "chapter",
"chapter", "chapter", "chapter", "chapter", "chapter", "chapter",
"chapter", "chapter", "chapter", "chapter"), ch_n = c(1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), book = structure(c(1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("book1",
"book2"), class = "factor"), sentence_id = 1:15, freq = c(1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L)), row.names = c(NA,
-15L), groups = structure(list(sentence = c("»Großvater«, sagte das Heidi, das dem Vorgang verwundert zugeschaut hatte, »warum tut der Peter jetzt immer wie der große Türk, wenn der eine Rute hinter sich merkt; dann scheut er mit dem Kopf und schüttelt ihn nach allen Seiten und macht auf einmal Sprünge in die Luft hinauf.«",
"»Vielleicht merkt der Peter auch eine Rute hinter sich, die er verdient«, antwortete der Großvater.",
"Als er die Gruppe gewahr wurde, näherte er sich langsam, streckte den Brief dem Öhi entgegen, und sobald dieser ihn erfaßt hatte, sprang er scheu zurück, so als ob ihn etwas erschreckt habe, und dann guckte er schnell hinter sich, gerade als ob von hinten ihn auch noch etwas hätte erschrecken wollen; dann machte er einen Sprung und lief davon, den Berg hinauf.",
"Behaglich stand der Öhi dabei und schaute bald auf die frischen Gesichter der Kinder, bald auf seine sauber glänzenden Geißen nieder.",
"Beides mußte ihm gefallen, denn er lächelte vergnüglich.",
"Da stand er still und drehte scheu den Kopf nach allen Seiten.",
"Diesen Brief brachte am andern Tage der Peter in der Frühe mit sich, als er auf die Weide zog.",
"Es wird Abschied genommen, aber auf Wiedersehen Die Großmama hatte einen Tag vor ihrer Ankunft noch einen Brief nach der Alp hinauf geschrieben, damit sie oben bestimmt wüßten, daß sie komme.",
"Hinter jedem Busch hervor, aus jeder Hecke heraus meinte jetzt der Peter den Polizeidiener aus Frankfurt auf sich losstürzen zu sehen.",
"Je länger aber diese gespannte Erwartung dauerte, je schreckhafter wurde es dem Peter zumute, er hatte keinen ruhigen Augenblick mehr.",
"Jetzt kam der Peter heran.", "Nun mußte das Heidi seine Hütte aufräumen, denn die Großmama sollte doch alles in guter Ordnung finden, wenn sie kam.",
"Nur die erste Halde hinauf lief der Peter so in einem Zuge davon; sobald man ihn von unten nicht mehr sehen konnte, kam es anders.",
"Plötzlich tat er einen Sprung und schaute hinter sich, so erschreckt, als habe ihn eben einer im Genick gepackt.",
"Schon war der Großvater mit den Kindern aus der Hütte getreten, und auch Schwänli und Bärli standen beide draußen und schüttelten lustig ihre Köpfe in der frischen Morgenluft, während die Kinder sie streichelten und ihnen glückliche Reise wünschten zu ihrer Bergfahrt."
), .rows = structure(list(8L, 9L, 7L, 4L, 5L, 11L, 2L, 1L, 13L,
14L, 6L, 15L, 10L, 12L, 3L), ptype = integer(0), class = c("vctrs_list_of",
"vctrs_vctr", "list"))), row.names = c(NA, 15L), class = c("tbl_df",
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df",
"tbl_df", "tbl", "data.frame"))
search_words <- structure(list(word = c("Ära", "Arsenfahlerz", "Arsenikbleispath",
"Arsensaures", "Blei", "Aufschiebung", "Ausliegerberg", "Baltischer",
"Schild", "Bänderton", "Bändertondatierung", "Bändertonkalender",
"Beben", "Bebenherd", "Belgit", "Hüttenwesen", "Bergbau", "Bergkamm",
"Bergmassiv", "Bergmehl", "Bergsporn", "Bergstock", "Binnit",
"Biostratigrafie", "Biostratigraphie", "Blattsilikat", "Blattverschiebung",
"Bleiapatit", "Block", "Blutjaspis", "Bodenerhebung", "Bodenkunde",
"Bodenwissenschaft", "Böhmische", "Masse", "Böhmisches", "Hochland",
"Massiv", "Bolus", "Alba", "Bongo", "Berge", "Braunauer", "Wände",
"Braunbleierz", "Brauner", "Glaskopf", "Jura", "Braunjura", "Bruch",
"Bruchflügel", "Bruchlinie", "Bruchschollentektonik", "Bruchtektonik",
"Buckel", "Budweis", "Wittingauer", "Tiefplatte", "Bühel", "Bühl",
"Buntbleierz", "Calciovolborthit", "Calciumcarbonat", "Calciumkarbonat",
"Calciumsulfat", "Cassiterit", "Celit", "Cevennen", "Chalcedon",
"Chalkosin", "Chalzedon", "Chilenische", "Schweiz", "Chronostratigrafie",
"Chronostratigraphie", "Coltan", "Columbeisen", "Columbit", "Conichalcit",
"Danakil", "Deflation", "Depression", "Desertation", "Desertifikation",
"Diatomeenerde", "Diatomeenpelit", "Diatomit", "Diatrema", "Dislokation",
"Dolomit", "Dolomitstein", "Donau", "Iller", "Lech", "dunkles",
"Fahlerz", "Durchschlagsröhre", "Edaphologie", "Eem", "Interglazial",
"Warmzeit", "Effusivgestein", "einfache", "Scherung", "Einzugsgebiet",
"Eisenerz", "Eisenkies", "Eisensulfid", "Eisvulkan", "Eiszeit",
"Eiszeitalter", "Endmoräne", "endogene", "Dynamik", "Prozesse",
"Entwässerungsgebiet", "Epirogenese", "Epizentrum", "Erdbeben",
"Erdbebenforscher", "Erdbebenschwarm", "Erdbebenwarte", "Erdbebenwelle",
"Erdbebenzentrum", "Erdkruste", "Erdrinde", "Erdstoß", "Erdzeitalter",
"Ergussgestein", "Erhebung", "Erhöhung", "Erosion", "Erratiker",
"erratischer", "Eruptionsschlot", "Eruptivgestein", "Erz", "Expansionshypothese",
"Extrusivgestein", "Falkengebirge", "Faulschlamm", "Fels", "Felsblock",
"Felsburg", "Felsen", "Felsenkunde", "Felsmechanik", "Felsnadel",
"Felsnase", "Felssporn", "Felsturm")), row.names = c(NA, -151L
), class = c("tbl_df", "tbl", "data.frame"))
Upvotes: 1
Reputation: 166
If you're still looking for a solution, you might try this which is based on the tidyverse version of R's string capabilities.
For each sentence in the original data frame you want to check every word in the word list to see if they appear in the sentence. Note that I changed the name of your df
to word_df
library(stringr)
for (i in 1:nrow(word_df)) {
word_check <- function (x) {
str_detect(word_df$sentence[i],x)
}
word_df$geo[i]<- any(sapply(word_list, word_check))
}
word_df
I created the "word_check" function which uses the str_detect
function in stringr
to check if a word from the word list appears in the sentence. I then used sapply
to check every word in the word list against the sentence. I then used any
to assign a value of TRUE
for the sentence if any of the words from the word list appear in it. The for
loop then repeats this process for each sentence (i.e. changing the index of the original df against which the word list is checked).
I believe your original data didn't have any matches, which makes it harder to check if the solution is correct, but I changed some words around so that words from the list appear in the sentences and it appears to be working.
You may also considering nesting sapply
statements if you feel the for
loop runs too slowly.
Upvotes: 1