Я имею дело с комбинациями переменных. В моей модели комбинация (A,B) будет аналогична (B,A). Я хотел бы изменить свои данные, чтобы получить похожие комбинации в том же порядке.
Я пытаюсь использовать функцию duplicated
и работать с функцией paste
, но не решаю проблему.
Это моя первая таблица:
df <- data.frame(V1=c("A","A","A","B","B","B"),
V2=c("B","C","D","A","D","A"))
Это то, что я хотел бы получить:
df2 <- data.frame(V1=c("A","A","A","B","B","B"),
V2=c("B","C","D","A","D","A"),
Test=c("OK","OK","OK","FALSE","OK","FALSE"),
V1b=c("A","A","A","A","B","A"),
V2b=c("B","C","D","B","D","B"))
Да - правильный порядок для меня не особо важен. На самом деле я просто хотел бы, чтобы все (A,B) и (B,A) стали либо (A,B); (А,В) или (В,А) ; (Б;А)
Я думаю, что алгоритм может быть итеративным => У меня есть комбинация (B,A). Если (A,B) существуют в верхней части таблицы, то поставить (A,B) вместо (B,A), но я не знаю, как это сделать
Предполагая, что "правильный порядок" - это алфавитный порядок, вы можете использовать
alphabetical <- function(x,y){x < y}
которые возвращают true, когда x, y отсортированы по алфавиту, и false в противном случае.
Обновлено: вот рабочее решение:
df_sorted <- df %>% rowwise() %>% mutate(Test = alphabetical(as.character(V1),as.character(V2))) %>%
mutate(V1b = if (Test) {
as.character(V1)
} else {
as.character(V2)
}) %>%
mutate(V2b = if (Test) {
as.character(V2)
} else {
as.character(V1)
})
С помощью dplyr
вы можете:
df %>%
mutate(V1b = pmin(V1, V2),
V2b = pmax(V1, V2),
Test = paste0(V1, V2) != paste0(V1b, V2b))
V1 V2 V1b V2b Test
1 A B A B FALSE
2 A C A C FALSE
3 A D A D FALSE
4 B A A B TRUE
5 B D B D FALSE
6 B A A B TRUE
Вы хотите сказать, что он каким-то образом должен определить, что (B, A) не является правильным порядком, объявить его ложным, а затем сказать, что он должен быть (A, B)? Тогда как определить правильный порядок?