【问题标题】:Using distinct() with a vector of column names将 distinct() 与列名向量一起使用
【发布时间】:2019-03-19 10:23:47
【问题描述】:

我在 tibble/data.frame 上使用来自 dplyr 的distinct() 有一个问题。从文档中可以清楚地看出,您可以通过明确命名列名来使用它。我有一个超过 100 列的数据框,并且想在一个子集上使用该功能。我的直觉说我将列名放在一个向量中,并将其用作不同的参数。但是 distinct 只使用第一个向量元素

虹膜示例:

data(iris)
library(dplyr)


exclude.columns <- c('Species', 'Sepal.Width')
distinct_(iris, exclude.columns)

这不同于

exclude.columns <- c('Sepal.Width', 'Species')
distinct_(iris, exclude.columns)

我认为此操作没有区别。另一种选择是对 data.frame 进行子集化,然后使用 distinct 并再次与排除的列连接。但我的问题是,是否有另一种选择只使用一个功能?

【问题讨论】:

  • 您可以只列出distinct 中的列并使用.keep_all = TRUE 参数。或者,您可以从 dplyr v0.8 开始使用 distinct_at
  • @arg0naut:问题不在于列表,而是 distinct() 仅对第一个向量元素进行操作,而不是像预期的那样对两者都进行操作。 distinct_at() 不在文档中,我会试一试。
  • 也试试distinct(iris, !!! syms(exclude.columns))
  • 谢谢,这应该可行!
  • @arg0naut91,您可以考虑发布您的distinct(iris, !!! syms(exclude.columns)) 评论作为答案吗?它非常有帮助,应该更明显。

标签: r dataframe dplyr distinct


【解决方案1】:

按照我的评论建议,您也可以尝试:

data(iris)
library(dplyr)

exclude.columns <- c('Species', 'Sepal.Width')

distinct(iris, !!! syms(exclude.columns))

输出(前 10 行):

   Sepal.Width    Species
1          3.5     setosa
2          3.0     setosa
3          3.2     setosa
4          3.1     setosa
5          3.6     setosa
6          3.9     setosa
7          3.4     setosa
8          2.9     setosa
9          3.7     setosa
10         4.0     setosa

但是,这是在 2 年前提出的。最新dplyr 功能的更正确用法是:

distinct(iris, across(all_of(exclude.columns)))

我不完全清楚你是想只保留exclude.columns 还是实际上排除它们;如果是后者,那么您只需在前面加上减号,即distinct(iris, across(-all_of(exclude.columns)))

【讨论】:

    【解决方案2】:

    你的目标听起来不清楚。您是否试图在除$Species$Sepal.Width 之外的所有列中获取所有不同的行?如果是这样,那就没有意义了。

    假设除 $Sepal.Width 之外的所有其他变量中的两行都相同。以您描述的方式使用distinct() 会丢弃第二行,因为它与第一行没有区别。除了它在您忽略的列中。

    你需要重新考虑你的目标以及它是否有意义。

    如果你只是担心重复行,那么

    data %>%
      distinct(across(everything()))
    

    会成功的。

    【讨论】:

      猜你喜欢
      • 2017-02-16
      • 1970-01-01
      • 2021-11-18
      • 2011-03-01
      • 1970-01-01
      • 2017-09-10
      • 2015-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多