【问题标题】:Count number of rows matching a criteria计算符合条件的行数
【发布时间】:2015-01-28 15:24:51
【问题描述】:

我正在寻找与此 SQL 语句等效的 R 中的命令。我希望这是一个非常简单的基本解决方案,无需使用复杂的函数或 dplyr 类型的包。

Select count(*) as number_of_states 
  from myTable
where  sCode = "CA"

所以基本上我会计算符合我的 where 条件的行数。

我已经将一个 csv 文件作为数据框导入到 mydata 中。到目前为止,我已经尝试了这些都无济于事。

  1. nrow(mydata$sCode == "CA") ## ==>> returns NULL

  2. sum(mydata[mydata$sCode == 'CA',], na.rm=T) ## ==>> gives Error in FUN(X[[1L]], ...) : only defined on a data frame with all numeric variables

  3. sum(subset(mydata, sCode='CA', select=c(sCode)), na.rm=T) ## ==>> FUN(X[[1L]], ...) : only defined on a data frame with all numeric variables

  4. sum(mydata$sCode == "CA", na.rm=T) ## ==>> returns count of all rows in the entire data set, which is not the correct result.

以及上述示例的一些变体。任何帮助,将不胜感激!谢谢。

【问题讨论】:

  • sum(mydata$sCode == "CA") 应该可以工作。如果没有一个最小的可重现示例,我们将无能为力。
  • 我认为选项 4 会起作用。前任。 dat <- data.frame(x=c("a", "b", NA)) ; sum(dat$x=="a", na.rm=T)
  • “NROW”(大写字母)的使用适用于矢量,但它可能会产生误导,应在正确编码时避免使用。
  • @SteveKern:你要样本数据吗?
  • @user20650:你能澄清一下吗? x 在您的陈述中代表什么 - data.frame(x=c("a", "b", NA)) ; ?我认为每个语法都需要 c,“a”和“b”是状态代码,如“CA”和“WA”?

标签: r


【解决方案1】:

mydata$sCode == "CA" 将返回一个布尔数组,在满足条件的任何地方都有一个TRUE 值。举例说明:

> mydata = data.frame(sCode = c("CA", "CA", "AC"))
> mydata$sCode == "CA"
[1]  TRUE  TRUE FALSE

有几种方法可以解决这个问题:

  1. sum(mydata$sCode == "CA"),如 cmets 中所建议的那样;因为 TRUE 被解释为 1,FALSE 被解释为 0,这应该返回 您的向量中有多个 TRUE 值。

  2. length(which(mydata$sCode == "CA")); which() 函数 返回满足条件的索引向量, 其中长度是"CA"的计数。

编辑以扩展 #2 中发生的事情:

> which(mydata$sCode == "CA")
[1] 1 2

which() 返回一个向量,标识满足条件的每一列(在本例中为数据帧的第 1 列和第 2 列)。这个向量的length()是出现次数。

【讨论】:

  • @mult-sam,你的意思是我提供的第二个建议 (length(which(mydata$sCode == "CA"))) 不适合你吗?如果无法访问您的数据,我不确定为什么会使用我的答案中提供的简单示例数据框来确保代码正常运行。
  • 是的,它没有给我正确的结果。上面的长度语句正在重新调整 DF 中所有行的计数,而不是正确的结果。
  • @multi-sam 您需要提供一个可重现的示例。这里的解决方案适用于示例数据集。如果它不适用于您的数据,您需要提供您的数据并证明这一点。
  • 解决方案 #2 对我有用!谢谢@乔! @multi-sam,您确定并非 DF 中的所有观察结果都来自加利福尼亚? :P 谢谢你的问题顺便说一句。
【解决方案2】:

sum用于添加元素; nrow用于统计矩形数组(一般是矩阵或data.frame)的行数; length 用于计算向量中元素的数量。您需要正确应用这些功能。

假设您的数据是一个名为“dat”的数据框。正确的解决方案:

nrow(dat[dat$sCode == "CA",])
length(dat$sCode[dat$sCode == "CA"])
sum(dat$sCode == "CA")

【讨论】:

  • 所有这些都是我已经尝试过的,返回DF中所有行的计数,不是正确的结果。
  • @multi-sam——这是不可能的。显示您的代码。这是汽车数据的示例:data(cars); str(cars)data.frame': 50 obs. of 2 variables: $ speed: num 4 4 7 7 8 9 10 10 10 11 ... $ dist : num 2 10 4 22 16 10 18 26 34 17 ... > nrow(cars[cars$speed == 4,]) [1] 2 > length(cars$speed[cars$speed == 4]) [1 ] 2
  • @multi-sam 你需要提供一个可重现的例子。这里的解决方案适用于示例数据集。如果它不适用于您的数据,您需要提供您的数据并证明这一点。
  • 这些都不起作用,当只有 654 行时得到 34336。
【解决方案3】:
  1. mydata$sCode 是一个向量,这就是 nrow 输出为 NULL 的原因。
  2. mydata[mydata$sCode == 'CA',] 返回data.frame,其中sCode == 'CA'。 sCode 包括字符。这就是 sum 给你错误的原因。
  3. subset(mydata, sCode='CA', select=c(sCode)),您应该使用sCode=='CA' 而不是sCode='CA'。然后子集返回你的向量,其中 sCode 等于 CA,所以你应该使用

    长度(子集(na.omit(mydata), sCode='CA', select=c(sCode)))

或者你可以试试这个:sum(na.omit(mydata$sCode) == "CA")

【讨论】:

  • 同上。返回 DF 中所有行的计数。
  • 你到底尝试了这个长度(子集(na.omit(mydata),sCode='CA',select=c(sCode)))或这个总和(na.omit(mydata$ sCode) == "CA")?
  • 嗨,我都试过了;第一个返回计数 1,第二个返回所有行的计数;两者都是不正确的结果。
  • 能否提供您的示例数据集?因为它适用于我的。
【解决方案4】:

尝试使用子集

nrow(subset(data,condition))

例子

nrow(subset(myData,sCode == "CA"))

【讨论】:

    【解决方案5】:

    dplyr包,使用

     nrow(filter(mydata, sCode == "CA")),
    

    这里提供的所有解决方案都给了我与 multi-sam 相同的错误,但那个有效。

    【讨论】:

      【解决方案6】:

      要获得观察数,数据集中的行数会更有效:

      nrow(dat[dat$sCode == "CA",])
      

      【讨论】:

        【解决方案7】:

        可以使用grep命令

        CA = mydata[grep("CA", mydata$sCode, ]

        行(CA)

        【讨论】:

        • 您能详细说明一下吗?
        • CA = mydata[grep("CA", mydata$sCode), ] 此命令将创建一个数据框“CA”,该数据框仅由包含字符 CA 的行组成。并且 nrow() 将返回没有这样的列
        【解决方案8】:

        调用nrow,将数据集的名称作为参数传递:

        nrow(dataset)
        

        【讨论】:

          【解决方案9】:

          我正在使用这个简短的函数来更轻松地使用dplyr

          countc <- function(.data, ..., preserve = FALSE){
             return(nrow(filter(.data, ..., .preserve = preserve)))
          }
          

          有了这个,你可以像filter一样使用它。例如:

          countc(data, active == TRUE)
          [1] 42
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-02-09
            • 2022-07-14
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多