我有一个数据帧(假设它有大量的列),我想按给定列进行分组.然后,我希望我的脚本的输出是一个新的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