R:当不是所有类别出现时,计算每列中的类别

时间:2017-05-03 14:03:03

标签: r tidyverse purrr

包含data.frame列的简单character

df <- data.frame(x = c("a", "b", "c", "c"), y = c("a", "b", "b", "c"))

假设我希望计算每列的类别,并快速返回另一列data.frame。以下使用来自map的{​​{1}}优雅且有效:

purrr

但是。如果并非所有类别都出现在每列中,该怎么办?例如:

df %>%
  map(table) %>%
  Reduce(cbind, .) %>%
  data.frame() %>%
  set_names(c("x", "y"))

  x y
a 1 1
b 1 2
c 2 1

我希望df2 <- data.frame(x = c("a", "b", "b"), y = c("a", "a", "a")) 列中b的点数为y。但我明白了:

0

甚至没有警告!我猜这是因为df2 %>% map(table) %>% Reduce(cbind, .) %>% data.frame() %>% set_names(c("x", "y")) x y a 1 3 b 2 3 回收一列的元素以匹配另一列的长度。我尝试使用cbind至少获取缺失类别的qpcR:::cbind.na值,我稍后可以将其转换为NA但是我收到此错误:

0

什么是优秀的快速解决方案,最好来自Error in matrix(, maxRow - nrow(x), ncol(x)) : invalid 'ncol' value (too large or NA) 套餐?

更新:

对于我们知道所有类别都在所有列中的第一种情况:

tidyverse

可能更优雅。

1 个答案:

答案 0 :(得分:1)

您可以使用来自tidyr的gather()spread(),并在中间使用dplyr&#39; s count()

library(dplyr)
library(tidyr)

df2 <- data_frame(x = c("a", "b", "b"), y = c("a", "a", "a"))

df2 %>%
  gather(key, value) %>%
  count(key, value) %>%
  spread(key, n, fill = 0)

结果:

  value     x     y
* <chr> <dbl> <dbl>
1     a     1     3
2     b     2     0

fill = 0中的spread()是导致b / y对为0的原因。