首页 > 解决方案 > 将字符串提取到每行中的不同单词 - R

问题描述

我有一个包含各种单词的列的数据框。我还有一个单独的字符串列表(与 df 的长度不同),我想在数据框中创建一个新列,将字符串与列中的单词匹配,但只保留字符串的一部分直到那个词。

例如:我有这张桌子:

苹果
植物
香蕉
动物
大肠杆菌

和这些字符串:

stringlist <- c("eukaryote;plant;apple", "eukaryote;plant;banana","eukaryote;animal;dog", "eukaryote;plant;orange" "eukaryote;animal;cat"; "eukaryote;insect;fly", "prokaryote;bacterium;ecoli")

我想得到这个:

新词
苹果 真核生物;植物;苹果
植物 真核生物;植物
香蕉 真核生物;植物;香蕉
动物 真核生物;动物
真核生物;昆虫;苍蝇
大肠杆菌 原核生物;细菌;大肠杆菌

我尝试了一些类似的东西:

df$words <- c("apple", "plant", "banana", "animal", "fly", "ecoli")
df$new_words<- sub(df$words, "", stringlist)

标签: r

解决方案


遍历“words”列,获取匹配的“stringlist”值grep,用于sub捕获包含单词的字符并将其替换\\1为捕获组的反向引用()

df$new_words <- sapply(df$words, function(x) 
    sub(sprintf("(.*%s).*", x), "\\1", grep(x, stringlist, 
     value = TRUE)[1]))

-输出

> df
   words                  new_words
1  apple      eukaryote;plant;apple
2  plant            eukaryote;plant
3 banana     eukaryote;plant;banana
4 animal           eukaryote;animal
5    fly       eukaryote;insect;fly
6  ecoli prokaryote;bacterium;ecoli

数据

df <- structure(list(words = c("apple", "plant", "banana", "animal", 
"fly", "ecoli")), class = "data.frame", row.names = c(NA, -6L
))

stringlist <- c("eukaryote;plant;apple", "eukaryote;plant;banana", 
"eukaryote;animal;dog", 
"eukaryote;plant;orange", "eukaryote;animal;cat", "eukaryote;insect;fly", 
"prokaryote;bacterium;ecoli")

推荐阅读