用于在数据帧行之间遍历以查找变量的频率计数

时间:2017-10-03 21:26:04

标签: r for-loop dataframe

如何使用for循环遍历数据帧的行。

我正在编写代码来查找颜色为'E'的钻石的频率。但相反,我得到所有行的频率计数。以下是代码段:

dataframe1 <- data.frame(diamonds)
cntx <- function() {
     cnt <- 0
     for(i in 1:nrow(dataframe1)) {
         if(dataframe1$color == "E") cnt <- cnt+1
     }
     return(cnt)
}

3 个答案:

答案 0 :(得分:0)

我从您的代码中收到以下警告:

Warning messages:
1: In if (dataframe1$color == "E") { :
the condition has length > 1 and only the first element will be used

问题是dataframe1 $ color是dataframe1的行数长度的向量。您正在将长度为x的向量与长度为1的“向量”(“E”)进行比较。因此,R仅使用由比较产生的布尔向量的第一个元素。第一个元素似乎是“真实”。由于语句总是“真实”,因此它只计算每一行。

以下情况如何?

dataframe1 <- data.frame(color = c("E", "F", "E", "F"))
sum(dataframe1$color == "E")

答案 1 :(得分:0)

在这种情况下不需要循环。以下是一些方法:

基地R:

table(diamonds$color)

Hadleyverse

library(tidyverse)
diamonds %>%
   count(color)

如果你坚持循环:

cntx <- function(c){
  cnt <- 0
  for (i in 1:nrow(c)) {
    if (c$color[i] == "E") cnt <- cnt+1 #you forgot the i
    }
  return (cnt)
  }

cntx(diamonds)

你忘记循环中的[i]所以每次计算整个c$color == "E"布尔向量时,只有第一个元素(即T)用于评估,因此警告:

1: In if (c$color == "E") cnt <- cnt + 1 :
  the condition has length > 1 and only the first element will be used

,结果相当于i的数量。

答案 2 :(得分:0)

正如其他人所提到的,有很多工具可以用更少的击键来解决这个问题。

我个人的偏好是data.table解决方案:

library(data.table)
x <- as.data.table(diamonds)
x[color == "E",.N]

返回以下内容

[1] 9797

更复杂的查询几乎不需要任何额外的击键。

x[,.(Count = .N), by = .(color)]

返回

color   count
E       9797            
I       5422            
J       2808            
H       8304            
F       9542            
G       11292           
D       6775

x[price > 10000,.(carat = mean(carat)), by = .(color)]

返回

color   carat
J       2.146045            
E       1.523220            
G       1.638468            
F       1.538835            
I       1.980648            
D       1.463780            
H       1.866069