Удалять строки во фрейме данных только в том случае, если значения в двух столбцах инвертированы, а все остальные значения идентичны - PullRequest
0 голосов
/ 27 декабря 2018

Я работаю с набором данных радужной оболочки и манипулирую им следующим образом, чтобы получить фрейм данных вида, особенности1, особенности2, значения:

gatherpairs <- function(data, ..., 
                        xkey = '.xkey', xvalue = '.xvalue',
                        ykey = '.ykey', yvalue = '.yvalue',
                        na.rm = FALSE, convert = FALSE, factor_key = FALSE) {
  vars <- quos(...)
  xkey <- enquo(xkey)
  xvalue <- enquo(xvalue)
  ykey <- enquo(ykey)
  yvalue <- enquo(yvalue)

  data %>% {
    cbind(gather(., key = !!xkey, value = !!xvalue, !!!vars,
                 na.rm = na.rm, convert = convert, factor_key = factor_key),
          select(., !!!vars)) 
  } %>% gather(., key = !!ykey, value = !!yvalue, !!!vars,
               na.rm = na.rm, convert = convert, factor_key = factor_key)%>% 
    filter(!(.xkey == .ykey)) %>%
    mutate(var = apply(.[, c(".xkey", ".ykey")], 1, function(x) paste(sort(x), collapse = ""))) %>%
    arrange(var)
}

test = iris %>% 
         gatherpairs(sapply(colnames(iris[, -ncol(iris)]), eval))

Это взято из https://stackoverflow.com/a/47731111/8315659

Это дает мне этот фрейм данных со всеми комбинациями feature1 и feature2, но я хочу удалить дубликаты, если показано только обратное.Например, Petal.Length vs Petal.Width совпадает с Petal.Width vs Petal.Length.Но если есть две строки с одинаковыми значениями для Petal.Length и Petal.Width, я не хочу отбрасывать эту строку.Поэтому я просто хотел бы убрать строки, в которых все значения идентичны, за исключением того, что .xkey и .ykey перевернуты.По сути, это просто для воссоздания нижнего треугольника матрицы ggplot, показанной в приведенном выше связанном ответе.

Как это можно сделать?Jack

1 Ответ

0 голосов
/ 28 декабря 2018

Я думаю, что это можно сделать с помощью первой части исходного кода, которая выполняет одну операцию сбора.Используя пример iris, получится 600 строк вывода, по одному на каждый из 150 строк x 4 столбца в iris.

gatherpairs <- function(data, ..., 
                        xkey = '.xkey', xvalue = '.xvalue',
                        ykey = '.ykey', yvalue = '.yvalue',
                        na.rm = FALSE, convert = FALSE, factor_key = FALSE) {
  vars <- quos(...)
  xkey <- enquo(xkey)
  xvalue <- enquo(xvalue)
  ykey <- enquo(ykey)
  yvalue <- enquo(yvalue)

  data %>% {
    cbind(gather(., key = !!xkey, value = !!xvalue, !!!vars,
                 na.rm = na.rm, convert = convert, factor_key = factor_key),
          select(., !!!vars)) 
  } # %>% gather(., key = !!ykey, value = !!yvalue, !!!vars,
    #            na.rm = na.rm, convert = convert, factor_key = factor_key)%>% 
    # filter(!(.xkey == .ykey)) %>%
    # mutate(var = apply(.[, c(".xkey", ".ykey")], 1, function(x) paste(sort(x), collapse = ""))) %>%
    # arrange(var)
}
...