2017-05-03 57 views
1

簡單data.framecharacter列:R:計數在每列的類別時,並不是所有的類別出現

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

假設我希望在每列數的類別,快,返回另一個data.frame。下面使用mappurrr優雅的作品:

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

    x y 
a 1 1 
b 1 2 
c 2 1 

但是。如果不是所有類別都出現在每一列中,該怎麼辦?例如:

​​

我想在yb計數是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至少獲得失蹤的類別,我以後可以轉換爲0NA值,但我得到這個錯誤:

Error in matrix(, maxRow - nrow(x), ncol(x)) : 
    invalid 'ncol' value (too large or NA) 

什麼是偉大的,快速的解決方案,最好是從tidyverse組包?

UPDATE:

對於那些我們所知道的所有類別的第一種情況是所有列:

df %>% dmap(function(x) as.numeric(table(x))) 

可能是更優雅。

+0

在基R,下面的工作。 'sapply(df2,function(i)table(factor(i,levels = levels(unlist(df2)))))'。 'factor'用於包含所有可用的級別,它包含在'levels(unlist(df2))'中。 – lmo

回答

1

您可以使用tidyr的gather()spread(),dplyr的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 

spread()fill = 0是什麼原因引起的B/y對爲0

+0

謝謝。您。尼斯。 –

相關問題