【问题标题】:using an if statement in a for loop for counting rows based on a condition在 for 循环中使用 if 语句根据条件计算行数
【发布时间】:2019-06-19 07:35:57
【问题描述】:

我正在使用包 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 的缺失值

我做错了什么?

【问题讨论】:

  • 确保您的数据中没有NAs。 NA=="Lo" 产生您正在显示的错误。您可以通过which(is.na(txhousing$cat9)) 查询
  • 也许您正在寻找table。但是,是的,您的数据中有NA's

标签: r


【解决方案1】:

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

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

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 

【讨论】:

    【解决方案2】:

    如果我正确理解你的问题,你需要做的就是

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

    这告诉您“有多少数据点被归类为 Lo”。如果你想知道Lo和Hi,你可以的,你可以

    table(txhousing$cat)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-10
      • 2022-11-26
      • 2014-03-13
      • 1970-01-01
      • 1970-01-01
      • 2019-10-22
      相关资源
      最近更新 更多