2017-08-11 57 views
1

我在R.仅保留文本串中存在的另一个数据帧中的R

相对较新的,我有两个dataframes,每一个变量的只有所谓的finalcv

final样子:

V1 
humans, aged, female, stroke 
infant, male, echocardiography 
aneurysm, adolescent, female, diabetes 
pregnant, diabetes, female 
cardiovascular diseases, complications 

cv看起来像

V2 
stroke 
pregnant 
echocardiography 
aneurysm 
diabetes 
cardiovascular diseases 

我想操纵final,使其只包括存在于cv文本。这就是我想要的产生的final数据框的样子:

V1 
stroke 
echocardiography 
aneurysm, diabetes 
pregnant, diabetes 
cardiovascular diseases 

请指教。谢谢!

+1

请勿在此处复制/粘贴您的数据。请阅读[如何在R中创建一个很好的重现示例](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – Masoud

回答

4

我们可以使用dplyrstringr中的函数。此外,rebus中的or1函数对构造正则表达式短语非常有用。 str_extract_all可以提取所有匹配的字符串。如果有多个短语,str_extract_all的输出将创建类似c("aneurysm", "diabetes")的东西。我用几个str_replace致电fixed来替换c(,)"为空。这部分可以更有效地使用正则表达式,但我不熟悉正则表达式。 df_final是最终的输出。

# Load packages 
library(dplyr) 
library(stringr) 
library(rebus) 

# Create example data frame 
df1 <- data_frame(V1 = c("humans, aged, female, stroke", "infant, male, echocardiography", 
         "aneurysm, adolescent, female, diabetes", "pregnant, diabetes, female", 
         "cardiovascular diseases, complications")) 
df2 <- data_frame(V2 = c("stroke", "pregnant", "echocardiography", "aneurysm", 
         "diabetes", "cardiovascular diseases")) 

# Process the data 
df_final <- df1 %>% 
    mutate(V1 = str_extract_all(V1, or1(df2$V2))) %>% 
    mutate(V1 = str_replace(V1, fixed("c("), "")) %>% 
    mutate(V1 = str_replace(V1, fixed(")"), "")) %>% 
    mutate(V1 = str_replace_all(V1, fixed('"'), "")) 
+0

谢谢,但您的代码只提取出每行显示的第一个短语。例如,在第三行,我想'动脉瘤,糖尿病',但你的代码只输出'aneurysm' – sweetmusicality

+0

@sweetmusicality请看我的更新。我相信'df_final'现在符合您的预期输出。 – www

+0

谢谢 - 我会试试这个。你能不能更新你的变量,以便两个数据帧有不同的变量('V1'和'V2'),因为我害怕我会使用错误的变量。谢谢! – sweetmusicality

相关问题