我在R中编写了一个函数,它将列名变量的向量作为字符串,并使用n_distinct
执行调整后的计数,如下所示:
library(tidyverse)
> packageVersion("tidyverse")
[1] ‘1.3.2’
vars <- c("Sepal.Length", "Petal.Width")
foo <- iris |>
group_by(Species) |>
mutate(
raw_count = n(),
adjusted_count = n_distinct(across(all_of(vars)))
)
对于Species
“setosa”,这将导致原始计数为50,调整后的计数为28。
然而,我有一个大数据集,并且这个函数正在R Shiny应用程序中使用,所以我尝试尽可能优化。
我读到过length(unique())
比n_distinct()
更快,并且我在其他函数中看到了一些加速,但是对于这种使用,我遇到了两个问题。
bar <- iris |>
group_by(Species) |>
mutate(
raw_count = n(),
adjusted_count = length(unique(across(all_of(vars))))
)
在本例中替换n_distinct()
会导致length(unique())
计算vars
向量(2)中不同字符串的数量,这显然不是所需的结果。
所以我用实际的变量名进行了测试。
baz <- iris |>
group_by(Species) |>
mutate(
raw_count = n(),
adjusted_count = length(unique(Sepal.Length, Petal.Width))
)
对于Species
“setosa”,这会导致原始计数为50,调整后的计数为15,我不确定为什么这会产生与n_distinct
不同的结果。
如果有人能解释结果的差异,以及如何将列名的字符向量传递给length(unique())
,我们将不胜感激。
1条答案
按热度按时间c9qzyr3d1#
如果您正在寻找一个快速的解决方案,您可以尝试
data.table::uniqueN
:当x是原子向量时,
uniqueN
等效于length(unique(x))
;当x是data.frame或data. table时,uniqueN
等效于nrow(unique(x))
。直接计算唯一行的数量,而无需具体化中间唯一data.table,因此速度更快,内存效率更高。该文档还告诉您,在 Dataframe 中,
n_distinct
的基R等价物是nrow(unique(x))
,而不是length(unique(x))
:这是因为应用于 Dataframe 的
length
计算列数,而不是行数:使用大型 Dataframe (30,000行,100组)进行基准测试: