计算 R 中数据框中的元素

Count elements in a dataframe in R

我有一个这样的数据框:

      ID                          TYPE
  100010700239816                932100Y
  100010700239816                9DDDDDDY
  100010700239822                0000000000011222211121110100000000000000Y

输出应该是这样的:

    ID                9   3   2   1   0   Y   D
 100010700239816      2   1   1   1   2   2   6
 100010700239822      0   0   5   9   11  1   0

所以这只是一个样本数据,单个单元格内可能有不同的元素,而所有这些元素的计数正是我要查找的。

我试过了:

 a <- count(TEST$TYPE)

 a <- table(TEST$TYPE)

但是我无法获得 id 的元素计数,我该怎么做?

我们可以拆分 'TYPE',按 'ID' 和 dcast 分组为 'wide' 格式

library(data.table)
dcast(setDT(df1)[, unlist(strsplit(TYPE, "")) , ID], ID ~V1)

我们还可以使用 tidyverse 中的函数。我们可以 strsplit 字符串,unnest 字符串和 count 每个字符串-ID 组合的数字。最后,我们可以spread数据框来得到想要的输出(dt2)。

dt <- read.table(text = "     ID                          TYPE
  100010700239816                932100Y
                 100010700239816                9DDDDDDY
                 100010700239822                0000000000011222211121110100000000000000Y",
                 header = TRUE, stringsAsFactors = FALSE)

library(tidyverse)

dt2 <- dt %>%
  mutate(TYPE = strsplit(TYPE, "")) %>%
  unnest() %>%
  count(ID, TYPE) %>%
  spread(TYPE, n, fill = 0) %>%
  select(c("ID", "9", "3", "2", "1", "0", "Y", "D"))

另一种方法 stringr

df2 <- aggregate(TYPE ~  ID, data=df, FUN=paste, collapse='')
df2[, unique(unlist(strsplit(df2$TYPE, "")))] <- 0
library(stringr)
df2[, unique(unlist(strsplit(df2$TYPE, "")))] <- sapply(colnames(df2[, unique(unlist(strsplit(df2$TYPE, "")))]), 
                                                      function(i) str_count(df2$TYPE, i))