【问题标题】:R - function like COUNTIFSR - 类似 COUNTIFS 的函数
【发布时间】:2018-07-17 23:00:59
【问题描述】:

我正在寻找 R 版本的 Excel 的“COUNTIFS”函数

场景:

我有两列充满值,我想添加一列来存储 Col1 和 Col2 中具有相同值的记录数

这就像必须将主键分成两列我猜

Col1 Col2 Col3 ColNew
A1   B1   EPP  2
A1   B2   EPP  1
A1   B1   EPP  2

在 Excel 中,我使用以下公式使其工作

=COUNTIFS(C:C,$C2,A:A,$A2,E:E,$E$2)>1

但它实际上返回了 TRUEFALSE 而不是数字

有什么想法吗?

【问题讨论】:

    标签: r excel data-manipulation


    【解决方案1】:

    假设你的数据框是df,那么请尝试:

    library(plyr)
    counts <- ddply(df, .(df$Col1, df$Col2), nrow)
    names(counts) <- c("Col1", "Col2", "Freq")
    

    您能否尝试将此作为替代解决方案:

    library(data.table)
    dt <- data.table(df)
    dt[, list(Freq =.N), by=list(Col1,Col2)]
    

    根据问题中提供的数据,我期待的结果集如下:

    Col1 Col2 Freq
    A1   B1   2
    A1   B2   1
    

    【讨论】:

    • 它返回不到文件中记录的一半,它只返回唯一值吗?如果我想保留它们怎么办?
    • @Doniu 嗯,它是通过按 Col1 和 Col2 分组来计算频率,所以我没想到在你的输出中会看到相同的总行数。编辑了我的答案,添加了替代解决方案
    【解决方案2】:

    dplyrdata.table 是两个流行的包,它们使“按组”处理事情变得非常容易。

    使用dplyr

    df %>% group_by(Col1, Col2) %>% mutate(ColNew = n())
    

    使用data.table

    setDT(df)
    df[, ColNew := .N, by = .(Col1, Col2)]
    

    【讨论】:

    • 我得到和错误:错误:不应直接调用此函数
    • 听起来你可能在 dplyr 库之后加载了 plyr 库 - plyr 使用了一些相同的函数名称(如 mutate),但使用的是旧版本,如果plyr 版本与 dplyr 一起使用会导致类似的错误。您可以指定dplyr::mutate 以确保您获得正确的版本,或者您可以确保如果同时加载plyrdplyr 包,首先加载plyr。跨度>
    • 啊,这是个问题。感谢您的解释,我会记住这一点以备不时之需
    【解决方案3】:

    ave 在这种情况下可能是一个非常有用的函数:

    df$ColNew <- ave(rep(1, nrow(df)), df$Col1, df$Col2, FUN = length)
    
    df
    #  Col1 Col2 Col3 ColNew
    #1   A1   B1  EPP      2
    #2   A1   B2  EPP      1
    #3   A1   B1  EPP      2
    

    【讨论】:

      【解决方案4】:
      transform(dat,col=ave(do.call(paste,dat),Col2,Col3,FUN = length))
        Col1 Col2 Col3 col
      1   A1   B1  EPP   2
      2   A1   B2  EPP   1
      3   A1   B1  EPP   2
      

      【讨论】:

      • 它没有记录,但我相信ave 将结果强制为与输入相同的类型。所以col 将是字符。您可以将结果强制为您想要的类型,或者只是将您的类型作为输入传递。
      • 谢谢。从来不知道。
      【解决方案5】:

      dplyr 有一个名为 add_count 的函数可以做到这一点:

      library(dplyr)
      df %>%
        group_by(Col1,Col2) %>%
        add_count
      
      # # A tibble: 3 x 4
      # # Groups:   Col1, Col2 [2]
      #    Col1  Col2  Col3     n
      #   <chr> <chr> <chr> <int>
      # 1    A1    B1   EPP     2
      # 2    A1    B2   EPP     1
      # 3    A1    B1   EPP     2
      

      数据

      df <- read.table(text="Col1 Col2 Col3
      A1   B1   EPP
      A1   B2   EPP
      A1   B1   EPP",header=TRUE,stringsAsFactors=FALSE)
      

      【讨论】:

      • 我还没有看到最后没有括号的管道中调用的函数,但我只是尝试了一下,它可以工作。 add_count 是唯一的还是仅仅因为它不需要额外的参数?
      • 当除了第一个参数和默认值之外没有其他参数时,您不需要它们。我读过无论如何都放它们是一种很好的做法,但我不想这样做。如果你在函数名前面加上包名,如dplyr::add_count,你需要括号
      • 这是一个很棒的功能,正是我需要的。感谢您的回答!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      • 2016-07-21
      相关资源
      最近更新 更多