【问题标题】:How to summarise values in a column with non-exact match in R?如何汇总 R 中不完全匹配的列中的值?
【发布时间】:2021-11-30 06:36:34
【问题描述】:

我有一个超过一万行的 data.table。我想在一列中计算变量出现的次数,但我想使用非精确匹配。 数据如下所示:

dt1 <- data.table (place = c("a north", "a south", "b south", "a north", "c west", "b north", "c south", "a west", "b west"))

     place
1: a north
2: a south
3: b south
4: a north
5: c west
6: b north
7: c south
8: a west
9  b west

我只想计算“a”、“b”和“c”独立于后面的单词出现的次数。我希望结果如下所示:

   a b c
1: 4 3 2

我尝试了 summarise、charmath 和 pmatch,但它们都不起作用。有人可以帮忙吗?

【问题讨论】:

  • @blrun 嘿现在。不要推动他们接受答案。对其中一个答案的赞成票,加上(也许)评论,都很好。他们会做到的。我当然不想觉得我不尊重那些仅仅通过不选择接受的人来回答我的问题的人;这太小问题了。如果他们删除了问题或对答案的质量说了些咸话,那么我会说出来,但这不是什么大问题。
  • @blrun 考虑到接受问题答案的行为完全是可选的,并且由提问者自行决定,因此在多个 cmets 按下他们标记答案的情况下责备某人是不合适的。今后请不要离开此类 cmets。相关元问题:meta.stackoverflow.com/q/298447meta.stackoverflow.com/q/251288
  • 好的,知道了。我是新来的。然而,我很惊讶你可以提出一个问题,得到一些非常有趣的答案,然后完全忽略它们。我并不是说我的答案也在那里。他可能没有选择其中一个答案。但他至少可以在那里发表简短的评论。

标签: r match summarize


【解决方案1】:

对初学者来说更简单的方法:

library("data.table")

library("dplyr")

dt1 <- data.table(place = c("a north", "a south", "b south", "a north", 
                            "c west", "b north", "c south", "a west", "b west"))

answer <- cbind(a = sum(startsWith(dt1$place, "a")) , 
        b = sum(startsWith(dt1$place, "b")),c = sum(startsWith(dt1$place, "c")))

【讨论】:

    【解决方案2】:

    一个简单的完整data.table 解决方案:

    library(data.table)
    
    dt1[,lapply(.SD, substr,1,1)][,.N, by = place]
    #>    place N
    #> 1:     a 4
    #> 2:     b 3
    #> 3:     c 2
    

    如果您需要矢量格式的结果:

    res <- dt1[,lapply(.SD, substr,1,1)][,.N, by = place]$N
    names(res) <- dt1[,lapply(.SD, substr,1,1)][,.N, by = place]$place
    
    res
    #> a b c 
    #> 4 3 2
    

    reprex package (v2.0.1) 于 2021 年 10 月 11 日创建

    【讨论】:

      【解决方案3】:

      table 与来自base Rtrimws 一起使用

      table(trimws(dt1$place, whitespace = "\\s+.*"))
      
      a b c 
      4 3 2 
      

      【讨论】:

        【解决方案4】:

        您可以尝试完整的data.table 解决方案:

         dt1[,'.'(var = sub(" .*", "",place))
           ][,'.'(cnt = .N), by = var
           ][,data.table::transpose(.SD, make.names= 'var')]
        
           a b c
        1: 4 3 2
        

        【讨论】:

          【解决方案5】:

          您可以使用mutate()substr() 创建一个仅包含您想要的字符串的新列,然后像这样使用count() 计算出现次数。

          library("data.table")
          library("dplyr")
          
          dt1 <- data.table(place = c("a north", "a south", "b south", "a north", "c west", "b north", "c south", "a west", "b west"))
          
          dt1 |>
            mutate(first_letter = substr(place,1,1)) |>
            count(first_letter)
          

          输出:

             first_letter n
          1:            a 4
          2:            b 3
          3:            c 2
          

          如果你想要一个不同的匹配,你可能需要在你的mutate 中使用正则表达式和case_when

          【讨论】:

            【解决方案6】:

            一切都取决于位置的变化程度和其他场景形状。

            您可以将列分成 2 列,然后分组计数

            dt1
            separate(dt1, place, into = c('letter', 'direction')) %>%
              group_by(letter) %>%
              count() %>%
              pivot_wider(names_from = letter, values_from = n) 
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-06-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多