如何使用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)
}
答案 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