通过 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))
我有 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))