gpt4 book ai didi

r - 根据R中每列中的每个值创建一个计数表

转载 作者:行者123 更新时间:2023-12-05 02:12:29 25 4
gpt4 key购买 nike

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

    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,但到目前为止没有运气。感谢您的帮助:)

最佳答案

我们可以收集成'long'格式,然后用分隔符分割'value',separate_rows,得到频率用count, spread 到 'wide' 格式

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

注意:如果我们需要'long'格式的输出,就不需要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,转换为“long”格式和count united 'key' 和 'rn' 列上

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

table(stack(lapply(test, function(x) unlist(strsplit(as.character(x), ", "))))[2:1])

关于r - 根据R中每列中的每个值创建一个计数表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55894527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com