使用DPLYR

时间:2017-10-25 19:19:27

标签: r dplyr

我有以下示例数据框:

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)

之后,我会将它们绑在一起。但是,我遇到了三个问题:

  • 这里有很多复制和粘贴(我的实际数据框中有更多列)
  • 结果长度不一样,这使得绑定变得困难;和
  • “0”不是原始表中的值,因此不会在结果中计算。

我在counting a specific value in multiple columns at once上的这个stackoverflow帖子中发现了一个类似的问题。但是,与那篇文章不同,我在这里遇到的问题是“分组依据”没有变量。

人们对如何在所有列的整数范围内生成值计数有任何建议吗?非常感谢!

3 个答案:

答案 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