использование оператора if в цикле for для подсчета строк на основе условия - PullRequest
0 голосов
/ 19 июня 2019

Я использовал набор данных txhousing из пакета ggplot2 и добавил столбец для проверки относительной производительности медианных значений.

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") {: пропущенное значение, где требуется ИСТИНА / ЛОЖЬ

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Проблема, как уже указывали другие, NA с.

В вашем цикле вы можете решить эту проблему, по крайней мере, несколькими способами.
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() - это когда вы хотите комбинировать уровни. Допустим, вы хотите узнать количество Lo и Hi в год или в каждом городе

(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 
0 голосов
/ 19 июня 2019

Если я правильно понимаю ваш вопрос, все, что вам нужно сделать, это

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

Это говорит вам "сколько точек данных было классифицировано как Lo". Если ты хочешь знать и Ло, и Привет, ты можешь

table(txhousing$cat)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...