Удалите повторяющиеся пары столбцов, сортируйте строки на основе двух столбцов
в следующем фрейме данных я хочу держать строки только один раз, если они имеют повторяющиеся пары (1 4 и 4 1 считаются одной и той же парой) Var1
и Var2
. Я думал о сортировке Var1
и Var2
в строке, а затем удалять повторяющиеся строки на основе Var1
и Var2
. Однако я не добираюсь до желаемого результата.
Вот как выглядят мои данные:
Var1 <- c(1,2,3,4,5,5) Var2 <- c(4,3,2,1,5,5) f <- c("blue","green","yellow","red","orange2","grey") g <- c("blue","green","yellow","red","orange1","grey") testdata <- data.frame(Var1,Var2,f,g)
Я могу сортировать строки, но значения столбцов f и g должны оставаться нетронутыми, как мне это сделать?
- Как изменить строку в R
- multithreading с R?
- Функция не найдена в R doParallel 'foreach' - Ошибка в {: task 1 failed - "не удалось найти функцию" растровый "
- Что такое замещающие функции в R?
- Увеличение на 1 для каждого изменения в столбце
testdata <- t(apply(testdata, 1, function(x) x[order(x)])) testdata <- as.data.table(testdata)
Затем я хочу удалить повторяющиеся строки на основе Var1
и Var2
Я хочу получить это как результат:
Var1 Var2 fg 1 4 blue blue 2 3 green green 5 5 orange2 orange1
Спасибо за вашу помощь!
- Слишком мало периодов для разложения ()
- R: преобразовать строку с разделителями в переменные
- Удаление пустых строк файла данных в R
- Как подсчитать количество уникальных значений по группе?
- Как вы конвертируете даты / время из одного часового пояса в другой в R?
- R: Маскированные функции
- Евклидово расстояние двух векторов
- Лучшее объяснение того, когда использовать импорт / зависимость
Вместо сортировки для всего набора данных сортируйте «Var1», «Var2», а затем используйте duplicated
для удаления повторяющихся строк
testdata[1:2] <- t( apply(testdata[1:2], 1, sort) ) testdata[!duplicated(testdata[1:2]),] # Var1 Var2 fg #1 1 4 blue blue #2 2 3 green green #5 5 5 orange2 orange1
Если люди заинтересованы в решении этого вопроса, используя dplyr:
library(dplyr) testdata %>% rowwise() %>% mutate(key = paste(sort(c(Var1, Var2)), collapse="")) %>% distinct(key, .keep_all=T) %>% select(-key) # Source: local data frame [3 x 4] # Groups: # # # A tibble: 3 × 4 # Var1 Var2 fg # # 1 1 4 blue blue # 2 2 3 green green # 3 5 5 orange2 orange1
Если данные велики, как в Sort Large amout данных и сохранять повторяющиеся пары значений в R , использование apply()
в каждой строке будет дорогостоящим. Вместо этого создайте набор уникальных значений
uid = unique(unlist(testdata[c("Var1", "Var2")], use.names=FALSE))
определить, нужен ли своп
swap = match(testdata[["Var1"]], uid) > match(testdata[["Var2"]], uid)
и обновление
tmp = testdata[swap, "Var1"] testdata[swap, "Var1"] = testdata[swap, "Var2"] testdata[swap, "Var2"] = tmp
удалять дубликаты по-прежнему
testdata[!duplicated(testdata[1:2]),]
Если бы было много дополнительных столбцов, и их копирование было бы дорогостоящим, более автономным решением было бы
uid = unique(unlist(testdata[c("Var1", "Var2")], use.names=FALSE)) swap = match(testdata[["Var1"]], uid) > match(testdata[["Var2"]], uid) idx = !duplicated(data.frame( V1 = ifelse(swap, testdata[["Var2"]], testdata[["Var1"]]), V2 = ifelse(swap, testdata[["Var1"]], testdata[["Var2"]]))) testdata[idx, , drop=FALSE]