我有一个数据框,其中包含这种格式的字符串等等。这是表格的样子,请注意,这只是数据的一小部分,我有16列以上:
x <- data.frame("v1_old" = c("[is_minimum] = '0'", "[is_minimum] = '0'"),
"v1_new" = c("[is_minimum] = '0' and [is_minimum] = '1'", "[is_minimum] = '0' and [t_sheet] ='1'"))
现在,我正在比较两对列,每对分别具有后缀_old和_new,并在每一行的字符串中发现差异,然后能够创建后缀为 _diff 的新列。
现在我已经尝试过使用第一个代码 CODE1:
df <- data.frame(x)
old_cols <- grep("old$", names(df), value = TRUE)
new_cols <- grep("new$", names(df), value = TRUE)
df[sub("new$", "diff", new_cols)] <- Map(stringr::str_remove,
df[new_cols], df[old_cols])
这是我通过这段代码得到的结果 RESULT1
result <- data.frame("v1_old" = c("[is_minimum] = '0'", "[is_minimum] = '0'"),
"v1_new" = c("[is_minimum] = '0' and [is_minimum] = '1'", "[is_minimum] = '0' and [t_sheet] ='1'"),
"v1_diff" = c ("[is_minimum] = '0' and [is_minimum] = '1'", "[is_minimum] = '0' and [t_sheet] ='1'"))
这不是我期望的结果。我希望diff列仅包含以前的旧列比较中不存在的那部分。
现在我有了这段代码,可以为我提供正确的结果,但是问题是我必须不断手动更改列名才能获得结果。它效率不高,我希望得到相同的结果,但是由于我有多个列,所以可以自动进行列选择。我的问题是如何使此代码自动化,使其像第一个一样工作,并给我相同的结果。这是代码和结果。 注意,每两对列的名称相同,只是它们的后缀为_old和_new(v1_old,v1_new,age_old,age_new,town_old,town_new ..如此等等。我正在比较。每对。 CODE2
x$v1_diff<- mapply(function(x, y) paste(setdiff(y, x), collapse = '| '), strsplit(x$v1_old, '\\||, | | -| \\+'), strsplit(x$v1_new, '\\||, | | -| \\+'))
此代码的结果是: RESULT2
result2 <- data.frame("v1_old" = c("[is_minimum] = '0'", "[is_minimum] = '0'"),
"v1_new" = c("[is_minimum] = '0' and [is_minimum] = '1'", "[is_minimum] = '0' and [t_sheet] ='1'"),
"v1_diff" = c (" and| '1'", "and| [t_sheet]| ='1'"))
第二个结果是我所期望的,但是正如您在第二个代码中看到的那样,我必须继续手动更改列名,而使用第一个代码则不需要。如何自动执行第二个代码或将其更改为第一个代码,但给出相同的输出?
答案 0 :(得分:0)
如果第二种方法适合您,请将其放入函数中并将其应用于多列
change_func <- function(a, b) {
mapply(function(x, y) paste(setdiff(y, x), collapse = '| '),
strsplit(a, '\\||, | | -| \\+'), strsplit(b, '\\||, | | -| \\+'))
}
df[sub("new$", "diff", new_cols)] <- Map(change_func, df[old_cols], df[new_cols])
数据
df <- data.frame(x, stringsAsFactors = FALSE)
old_cols <- grep("old$", names(df), value = TRUE)
new_cols <- grep("new$", names(df), value = TRUE)