包含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
可能更优雅。
答案 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的原因。