在R中比较字符串并提取短语级别的差异

在R中比较字符串并提取短语级别的差异,r,string,dataframe,R,String,Dataframe,我试图比较数据帧中包含字符串的两列,并提取差异。然而,我看到的所有解决方案都提取字符级别的差异,我希望提取整个单词/短语。我有一个如下设置的数据框: TECH_ID YRTR pre_drop_courses post_drop_courses unchanged 71795 20213 BUSN 2100,BUSN 2400,ACCT 2254 BUSN 1102,BUSN 1102,BUSN 1102 FALSE

我试图比较数据帧中包含字符串的两列,并提取差异。然而,我看到的所有解决方案都提取字符级别的差异,我希望提取整个单词/短语。我有一个如下设置的数据框:

TECH_ID YRTR    pre_drop_courses                post_drop_courses               unchanged
71795   20213   BUSN 2100,BUSN 2400,ACCT 2254   BUSN 1102,BUSN 1102,BUSN 1102   FALSE
71795   20183   BUSN 1102,BUSN 1102,BUSN 1102   BUSN 2100,BUSN 2400,ACCT 2254   FALSE
73677   20183   BIOL 2041,BIOL 2041,BIOL 2041   BIOL 2042,BIOL 2042,BIOL 2042   FALSE
73677   20193   BIOL 2042,BIOL 2042,BIOL 2042   BIOL 2041,BIOL 2041,BIOL 2041   FALSE
对于在pre_drop和post_drop列之间存在差异的行,我希望提取不同的整个课程代码。理想情况下,我会有一个专栏,介绍哪些课程取消了,哪些课程增加了。例如,在第一行中,BUSN 2100、BUSN 2400和ACCT 2254将全部显示在“已删除”列中,BUSN 1102将显示在“已添加”列中。同样,在第三行中,我们将看到删除了BIOL 2041,添加了BIOL 2042

编辑以显示dput的结果(头(mydata,3))


请允许我在制作课程列表时处理使其唯一的过程,因为它使解决方案更干净

加载
stringr
以删除任何不必要的空白,然后将课程字符串拆分为课程向量

库(stringr)
df$1前真实总线2100,总线2400,会计2254总线1102
#>2假总线1102总线2100,总线2400,账户2254
#>3真生物2041生物2042
#>投加
#>1母线2100、母线2400、会计2254母线1102
#>2总线1102总线2100,总线2400,ACCT 2254
#>3 BIOL 2041 BIOL 2042
您的原始样本数据


df为了确保您的数据与我所想的一样,请您编辑您的问题以显示dput(head(mydata,3))的结果。
,谢谢。@ChuckP edited!谢谢,但为什么在第1行中,学生会将同一课程列出3次?@ChuckP这可能是因为学生多次添加/删除课程,并且在早期的数据帧中,他们有多个时间戳。因此,如果一个学生添加了课程,放弃了课程,并添加了一个差异部分,它将显示为3个单独的实例。我计划在以后的步骤中减少重复的课程名称。哈哈,这就是为什么我们喜欢我们的“学生信息系统”的工作!但是,我有一些添加/删除的列,这些列的值类似于“MUSC 1116”,还有一些列的值类似于c(“MUSC 1116”)—是否有办法将这些列全部转换为匹配?我可能可以查看生成此奇数值的行之一的数据?>dput(head(all_courses2,1))结构(list(TECH_ID=“00000108”,YRTR=“20173”,pre_drop_courses=“马斯克2231,马斯克2281,马斯克2231,马斯克2281,马斯克2231,马斯克2281”,撤后课程=“马斯克1116,马斯克1116,马斯克1116”,不变=假,增加=列表(“马斯克1116”),撤下=列表(c(“马斯克2231”,“马斯克2281”)、前置=列表(c(“马斯克2231”,“马斯克2281”)、后置=列表(“马斯克1116”)、行名=1L、类=“数据框架”)
structure(list(TECH_ID = c("00000108", "00000108", "00000270"
), YRTR = c("20173", "20173", "20183"), pre_drop_courses = c("MUSC 2231,MUSC 2281,MUSC 2231,MUSC 2281,MUSC 2231,MUSC 2281", 
"MUSC 2231,MUSC 2281,MUSC 2231,MUSC 2281,MUSC 2231,MUSC 2281", 
"ACCT 1853,ACCT 1853,ACCT 1853"), post_drop_courses = c("MUSC 2231,MUSC 2281,MUSC 2231,MUSC 2281,MUSC 2231,MUSC 2281", 
"MUSC 1116,MUSC 1116,MUSC 1116", "ACCT 1853,ACCT 1853,ACCT 1853"
), unchanged = c(TRUE, FALSE, TRUE)), row.names = c(NA, 3L), class = "data.frame")