Различия между строками в двух парах столбцов - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть фрейм данных, который содержит строки в этом формате и многое другое.Вот как выглядит таблица. Обратите внимание, что это всего лишь небольшое подмножество данных, у меня более 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'"))

Второй результат - это то, что я ожидаю, но выво втором коде мне приходится постоянно менять имена столбцов вручную, а в первом коде - нет. Как я могу автоматизировать второй код или изменить его так, чтобы он выглядел как первый код, но выдает тот же результат?

1 Ответ

0 голосов
/ 23 сентября 2019

Если второй метод работает для вас, поместите его в функцию и примените к нескольким столбцам

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])

data

df <- data.frame(x, stringsAsFactors = FALSE)
old_cols <- grep("old$", names(df), value = TRUE)
new_cols <- grep("new$", names(df), value = TRUE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...