在for循环中使用if语句根据条件对行进行计数

时间:2019-06-19 07:35:57

标签: r

我正在使用ggplot2软件包中的数据集txhousing,并添加了一列来检查中值的相对性能。

a <- summary(txhousing$median)
txhousing$cat <- ifelse(txhousing$median > a[which(names(a) == "Median")], "Hi", "Lo")

我只想检查归类为Lo的数据点的数量,并为此编写代码

b <- 0
for (i in 1:nrow(txhousing)) {
  if (txhousing$cat[i] == "Lo") {
    b <- b + 1
  }
}

但是我遇到了错误

  

if(txhousing $ cat [i] ==“ Lo”){     缺少需要TRUE / FALSE的值

我在做什么错了?

2 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题,您要做的就是

sum(txhousing$cat == "Lo", na.rm= TRUE)
3995

这将告诉您“有多少个数据点被分类为Lo”。如果您想同时了解Lo和Hi,就可以

table(txhousing$cat)

答案 1 :(得分:0)

正如其他人指出的那样,问题是NA s。

在循环中,您至少可以通过两种方法解决此问题。
1:添加另一个条件,以便如果cat[i]不是NA并且cat[i]Lo,则递增。
2:将条件包装在isTRUE()中,如果TRUE则返回TRUE,否则返回FALSE,没有NA

b <- 0
for (i in 1:nrow(txhousing)) {
  if (!is.na(txhousing$cat[i]) & txhousing$cat[i] == "Lo") {
    b <- b + 1
  }
}

b <- 0
for (i in 1:nrow(txhousing)) {
  if (isTRUE(txhousing$cat[i] == "Lo")) {
    b <- b + 1
  }
}

schwantke当然是正确的,因为在相关列上加和是更可取的,并且应该考虑使用table()

然而,table()的真正优势在于您想要组合级别。假设您想知道每年或每个城市的LoHi的数量

(tab.y <- with(txhousing, table(year, cat)))
(tab.c <- with(txhousing, table(city, cat)))

margin.table(tab.y, margin=2)
cat
  Hi   Lo 
3991 3995