通过 tibble 的列循环管道

Looping a pipe through columns of a tibble

我有 20 个变量。到目前为止,我一直在使用此管道找出哪些值在单个列中出现多次

as_tibble(iris) %>% group_by(Petal.Length) %>% summarise(n=sum(n())) %>% filter(n>1)

我很想知道我是否可以写一行代码来遍历所有列和 return 20 个不同的小标题(或者我将来需要的数量),就像上面的管道一样return 一点点。我尝试编写自己的循环,但没有成功,我是新手。

鸢尾花示例数据集有 5 列,因此请随意给出 5 列的答案。

谢谢!

library(dplyr)

col_names <- colnames(iris)

lapply(
  col_names,
  function(col) {
    iris %>%
      group_by_at(col) %>%
      summarise(n = n()) %>% 
      filter(n > 1)
  }
)

在 base R 4.1+ 中,我们有这个单行代码。对于每一列,它应用 table,然后过滤掉那些值超过 1 的元素。最后,它将 table 的剩余部分转换为数据框。如果可以 return table 对象列表而不是数据帧列表,则省略堆栈。

lapply(iris, \(x) stack(Filter(function(x) x > 1, table(x))))

它的一个变体是只保留重复的项目,然后添加 1 以减少击键次数。同样,如果 returning 一个 table 对象的列表没问题,我们可以省略堆栈。

lapply(iris, \(x) stack(table(x[duplicated(x)]) + 1))