我有以下示例数据框:
df <- data.frame("Alpha" = c(NA, NA, 6, 5, 4, 6, 5, 3), "Beta" = c(3, 3, 4, 2, 6, NA, NA, NA), "Gamma" =c(6, 2, 3, 1, NA, NA, 5, 4))
根据这些数据,我想得到每列0到6之间所有值的计数。数据框不包含0到6之间的所有值,因此最终输出将如下所示:
result <- data.frame("value"=c(0, 1, 2, 3, 4, 5, 6),
"Alpha"=c(0, 0, 0, 1, 1, 2, 2),
"Beta"=c(0, 0, 1, 2, 1, 0, 1),
"Gamma"=c(0, 1, 1, 1, 1, 1, 1))
value Alpha Beta Gamma
0 0 0 0
1 0 0 1
2 0 1 1
3 1 2 1
4 1 1 1
5 2 0 1
6 2 1 1
我的第一个倾向是重申dplyr中的distinct()函数。我在考虑使用这样的东西:
df.alpha <- df %>% distinct(Alpha)
df.beta <- df %>% distinct(Beta)
df.gamma <- df %>% distinct(Gamma)
之后,我会将它们绑在一起。但是,我遇到了三个问题:
我在counting a specific value in multiple columns at once上的这个stackoverflow帖子中发现了一个类似的问题。但是,与那篇文章不同,我在这里遇到的问题是“分组依据”没有变量。
人们对如何在所有列的整数范围内生成值计数有任何建议吗?非常感谢!
答案 0 :(得分:1)
也许是这样的:
> df[] <- lapply(df,function(x) factor(x,levels = 0:6))
> data.frame(lapply(df,tabulate))
Alpha Beta Gamma
1 0 0 0
2 0 0 1
3 0 1 1
4 1 2 1
5 1 1 1
6 2 0 1
7 2 1 1
答案 1 :(得分:1)
与joran的答案相似的单行是
cbind.data.frame(values=0:6, sapply(df, function(x) table(factor(x, levels=0:6))))
返回
values Alpha Beta Gamma
0 0 0 0 0
1 1 0 0 1
2 2 0 1 1
3 3 1 2 1
4 4 1 1 1
5 5 2 0 1
6 6 2 1 1
使用table
函数替换tabulate
可以加快结果速度并简化输出。
答案 2 :(得分:0)
tidyverse
的另一个想法:
library(dplyr)
library(purrr)
df %>%
mutate_all(factor, levels = 0:6) %>%
map_dfc(~ c(table(.))) %>%
cbind(values = 0:6, .)
<强>结果:强>
values Alpha Beta Gamma
1 0 0 0 0
2 1 0 0 1
3 2 0 1 1
4 3 1 2 1
5 4 1 1 1
6 5 2 0 1
7 6 2 1 1