【发布时间】:2020-09-22 16:46:58
【问题描述】:
我正在尝试比较数据框中包含字符串的两列并提取差异。但是,我看到的所有解决方案都在字符级别提取差异,并且我希望提取整个单词/短语。我有一个这样的数据框:
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(head(mydata, 3)) 的结果
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")
【问题讨论】:
-
只是为了确保您的数据是我认为的数据,请您编辑您的问题以显示
dput(head(mydata, 3))的结果,谢谢。 -
@ChuckP 已编辑!
-
谢谢,但为什么在第 1 行中,学生的同一课程列出了 3 次?
-
@ChuckP 这可能是因为学生多次添加/删除课程,并且在较早的数据框中他们有多个时间戳。因此,如果学生添加课程、删除课程并添加差异部分,它将显示为 3 个单独的实例。我计划在以后的步骤中减少重复的课程名称。
-
哈哈,这就是为什么我们喜欢我们的“学生信息系统”