我有一个像这样开始的数据表:
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玩耍,但到目前为止还没有运气。谢谢您的帮助:)
答案 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