仅当两列中的值都相反并且所有其他值相同时,才删除数据框中的行

时间:2018-12-27 15:50:58

标签: r dplyr tidyr

我正在处理虹膜数据集,并按如下操作以获取种类,特征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与Petal.Width值,那么我不想删除该行。因此,我只想删除所有值都相同的行,只是将.xkey和.ykey取反。本质上,这只是为了重新创建上面链接的答案中所示的ggplot矩阵的底部三角形。

这怎么办? 杰克

1 个答案:

答案 0 :(得分:0)

我认为可以使用执行单个收集操作的源代码的第一部分来完成。以iris为例,这将产生600行输出,iris中150行x 4列中的每一个输出。

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