根据R

时间:2019-04-28 21:00:15

标签: r count dplyr

我有一个像这样开始的数据表:

    test <- data.frame("AZ" = c("ABCD, AAAA, BBBB"), "AK" = c("ABCD"), "NJ" = c("BBBC", "AAAA"))

每个列均为州(亚利桑那州,阿拉斯加,新泽西州),这些列中的值均为代码。如果单个单元格中有多个代码,则将用逗号分隔。

我想创建一个计数表,以显示每个状态显示的每个代码有多少。因此,该表最终将看起来像这样:

    test2 <- data.frame("ABCD" = c("2", "2", "0"), "AAAA" = c("2", "0", "1"), "BBBB" = c("2", "0", "0"), "BBBC" = c("0", "0", "1"), row.names = c("AZ", "AK", "NJ"))

是否有一种方法可以获取这样的表以在R中输出?我一直在和dplyr玩耍,但到目前为止还没有运气。谢谢您的帮助:)

1 个答案:

答案 0 :(得分:4)

我们可以将gather转换成'long'格式,然后用,用定界符separate_rows分割'value',并用count,{{1 }}为“宽”格式

spread

注意:如果我们需要'long'格式的输出,则无需library(tidyverse) gather(test) %>% separate_rows(value) %>% count(key, value) %>% spread(value, n, fill = 0) %>% column_to_rownames('key') # AAAA ABCD BBBB BBBC #AK 0 2 0 0 #AZ 2 2 2 0 #NJ 1 0 0 1

spread

更新

如果我们还需要按“行”分组,则创建一个gather(test) %>% separate_rows(value) %>% count(key, value) # A tibble: 6 x 3 # key value n # <chr> <chr> <int> #1 AK ABCD 2 #2 AZ AAAA 2 #3 AZ ABCD 2 #4 AZ BBBB 2 #5 NJ AAAA 1 #6 NJ BBBC 1 列,然后将row_number()做成“长”格式,并在gather上进行count d“键”和“ rn”列

unite

或使用test %>% mutate(rn = row_number()) %>% gather(key, val, -rn) %>% separate_rows(val) %>% unite(key, key, rn) %>% count(key, val) %>% spread(val, n, fill = 0) %>% column_to_rownames('key') # AAAA ABCD BBBB BBBC #AK_1 0 1 0 0 #AK_2 0 1 0 0 #AZ_1 1 1 1 0 #AZ_2 1 1 1 0 #NJ_1 0 0 0 1 #NJ_2 1 0 0 0

base R