计算R中数据框中的元素

时间:2017-08-21 15:02:34

标签: r string dplyr plyr

我有一个这样的数据框:

<body>
  <div class="container">
    <div class="nav">
      <div class="navheader">

        <div class="leftheader">
          <ul>
            <li style="float:left"><button class="buttonleft" type="button">SECTIONS</button></li>
            <li style="float:left"><a href="#home">HOME</a></li>
            <li style="float:left"><a href="#news">SEARCH</a></li>
          </ul>
        </div>
        <div class="rightheader">
          <ul>
            <li style="float:right"><button class="buttonheader1" type="button">LOG IN</button></li>
            <li style="float:right"><button class="buttonheader2" type="button">SUBSCRIBE</button></li>
          </ul>
        </div>
        <div class="imgheader">
          <img src="logo.png" alt="logo">
        </div>
      </div>
      <div class="navarticles">
      </div>
    </div>
    <div class="content">
    </div>
    <div class="footer">
    </div>
  </div>
</body>

输出应该是这样的:

      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)

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

3 个答案:

答案 0 :(得分:3)

我们可以拆分&#39; TYPE&#39;,按ID分组&#39;和dcast进入&#39;宽&#39;格式

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

答案 1 :(得分:2)

我们也可以使用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"))

答案 2 :(得分:0)

使用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))