首页 > 解决方案 > 每个列表列中的唯一计数

问题描述

我有一个带有由 str_extract_all() 创建的列表列的数据框。我正在尝试确定存在超过 1 个唯一值的情况

#Input =
#                         List
#1:                apple,apple
#2:               apple,banana
#3: apple,orange,orange,banana``


dat<-data.table::data.table(
          List = list(c("apple","apple"),
                   c("apple","banana"),
                   c("apple","orange","orange", "banana")),
  Count_Unique = c(1L, 2L, 3L),
  Multi = c(FALSE, TRUE, TRUE)
)

我尝试了 dplyr::mutate(Count_Unique = length(unique(List)),但这只是给了我整个数据集的唯一变量的数量。我确信它非常简单,我只是不知道如何做到这一点如果可能的话,使用 tidyverse 方法的逐行方式。

#Expected Output =
#                         List Count_Unique Multi
#1:                apple,apple            1 FALSE
#2:               apple,banana            2  TRUE
#3: apple,orange,orange,banana            3  TRUE

dat<-data.table::data.table(
          List = list(c("apple","apple"),
                   c("apple","banana"),
                   c("apple","orange","orange", "banana")),
  Count_Unique = c(1L, 2L, 3L),
  Multi = c(FALSE, TRUE, TRUE)
)

标签: rdplyrtidyversestringr

解决方案


您可以使用map_dbl

library(dplyr)
library(purrr)

dat %>% mutate(Multi = map_dbl(List, n_distinct) > 1)

#                         List Count_Unique Multi
#1:                apple,apple            1 FALSE
#2:               apple,banana            2  TRUE
#3: apple,orange,orange,banana            3  TRUE

使用基础 R :

dat$Multi <- sapply(dat$List, function(x) length(unique(x))) > 1

或在data.table

library(data.table)
setDT(dat)[, Multi := sapply(List, function(x) length(unique(x))) > 1]

推荐阅读