У меня есть фрейм данных, который содержит строки в этом формате и многое другое.Вот как выглядит таблица. Обратите внимание, что это всего лишь небольшое подмножество данных, у меня более 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 , означающим различия.
Теперь я попробовал с этим первым кодом КОД1:
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..like, так и так далее. Я сравниваю каждыйpair. 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'"))
Второй результат - это то, что я ожидаю, но выво втором коде мне приходится постоянно менять имена столбцов вручную, а в первом коде - нет. Как я могу автоматизировать второй код или изменить его так, чтобы он выглядел как первый код, но выдает тот же результат?