计算符合条件的行数

mul*_*sam 31 r

我在R中寻找一个等同于这个SQL语句的命令.我希望这是一个非常简单的基本解决方案,而不使用复杂的函数或dplyr类型的包.

Select count(*) as number_of_states 
  from myTable
where  sCode = "CA"
Run Code Online (Sandbox Code Playgroud)

所以基本上我会计算与我的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.

以及上述样本的一些变化.任何帮助,将不胜感激!谢谢.

Joe*_*Joe 33

mydata$sCode == "CA"将返回一个布尔数组,其TRUE值在满足条件的任何地方.为了显示:

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

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

  1. sum(mydata$sCode == "CA"),正如评论中所建议的那样; 因为 TRUE被解释为1和FALSE0,这应该返回TRUE向量中的数值.

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

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

> which(mydata$sCode == "CA")
[1] 1 2
Run Code Online (Sandbox Code Playgroud)

which()返回一个向量标识符合条件的每一列(在本例中为数据帧的第1列和第2列).该length()向量的数量是出现次数.

  • @sulti-sam你需要提供一个可重复的例子.此处的解决方案适用于示例数据集.如果它不能处理您的数据,您需要提供数据并证明这一点. (2认同)

Ale*_*x W 12

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

如果使用sum和R结构,所有解决方案都会显示出根本的误解.

假设您的数据是名为"dat"的数据框.正确的解决方案:

nrow(dat[dat$sCode == "CA",])
length(dat$sCode[dat$sCode == "CA"])
sum(which(dat$sCode == "CA"))
Run Code Online (Sandbox Code Playgroud)

  • 所有这些都是我已经尝试过的,返回 DF 中所有行的计数,而不是正确的结果。 (2认同)

Fed*_*ina 6

  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,所以你应该使用

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

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


小智 5

dplyr包装,使用

 nrow(filter(mydata, sCode == "CA")),
Run Code Online (Sandbox Code Playgroud)

此处提供的所有解决方案都给了我与 multi-sam 相同的错误,但该解决方案有效。