我有一个数据帧(假设它有大量的列),我想按给定列进行分组.然后,我希望我的脚本的输出是一个新的DataFrame或Tibble,原始DF中的每个组占一行,随后的每一列都包含一个与该列for that group中唯一值的数量相对应的数值.除了"group by"列之外,在脚本中显式引用列是不可行的.我当前的脚本使用for循环来实现这一点,但我想知道是否有更有效或更优雅的方法来实现这一点?我怀疑我的六行文字可能会重写得更快、更简洁,但我还不太擅长R.

前面关于这个主题的问题只涉及两个列,和/或显式引用单个列名,或者涉及data.table(我倾向于避免这样做,除非它使事情变得非常优雅),否则在我的场景中不起作用.但如果这是复制品,我很抱歉.

示例:

# my real df has many more columns than this
df <- data.frame(my_group=c('a','b','c','a','b','c','a','b','c'),
                 age=c(1,2,3,4,5,6,1,8,9),
                 gender=c(1,1,2,2,1,2,2,2,2),
                 x=c(T,F,F,T,F,T,F,F,F))

# separate the df into a list of smaller dfs, organized by group
t <- split(df[,colnames(df)!="my_group"], df$my_group)

results <- df[FALSE,] # prepare a template to bind new rows to

for ( i in 1:length(t)) {  #eeeww, a for loop
  z <- rapply(t[[i]], function(x) length(unique(unlist(x))))
  row <- data.frame(my_group=names(t[i]),t(data.frame(z)))
  results <- rbind(results, row, make.row.names=FALSE)
}

输出:

> results
  my_group age gender x
1        a   2      2 2
2        b   3      2 1
3        c   3      1 2
# correct, but slow and perhaps not very "r"-ish

我try 了GROUP_BY()和嵌套的Apply()调用,但始终无法完全实现目标.提前感谢您的任何建议.

Update:

感谢阿克塞拉、萨梅特·S、塔杰、奥马尔、穆拉德·哈利洛夫以及所有future 的贡献者!有几个很好的答案,很难挑出最终的答案.最后,我发现这三个解决方案最适合我.后两者将一些建议的答案组合成单独的一行程序.

df %>% group_by(my_group) %>% summarise_all(n_distinct) #Samet Sökel
summarize(df, across(everything(), n_distinct), .by=my_group) #TarJae, Umar
aggregate(. ~ my_group, data = df, n_distinct) #AkselA, TarJae, Umar, Samet Sökel

推荐答案

你可以同时使用n_distinctsummarise_all

library(dplyr)

df <- data.frame(my_group=c('a','b','c','a','b','c','a','b','c'),
                 age=c(1,2,3,4,5,6,1,8,9),
                 gender=c(1,1,2,2,1,2,2,2,2),
                 x=c(T,F,F,T,F,T,F,F,F))

df %>% group_by(my_group) %>% summarise_all(n_distinct)


my_group   age gender     x
  <chr>    <int>  <int> <int>
1 a            2      2     2
2 b            3      2     1
3 c            3      1     2

R相关问答推荐

使用gggplot 2在R中重新调整面板和y轴文本大小

使用rlang s arg_match判断函数输入列表

是否可以 Select 安装不带文档的R包以更有效地存储?

从多个前置日期中获取最长日期

将复杂的组合列表转换为数据框架

如何使用按钮切换轨迹?

以字符格式导入的ExcelElectron 表格日期列标题

在R中创建连续的期间

从多个可选列中选取一个值到一个新列中

将项粘贴到向量中,并将它们分组为x的倍数,用空格分隔

如何在R中改变fviz_pca_biplot中圆的边界线的 colored颜色 ?

多元正态分布的计算

通过R:文件名未正确写入[已解决]将.nc文件转换和导出为.tif文件

如何移动点以使它们的打印不重叠

如何从嵌套数据中自动创建命名对象?在R中

是否从列中删除★符号?

使用&Fill&Quot;在gglot中创建 colored颜色 渐变

R,将组ID分配给另一个观测ID变量中的值的组合

如何根据顺序/序列从数据框中排除值

如何在给定的环境中找到函数的函数参数?