Странная ошибка: Ошибка в if () { : отсутствует значение, где требуется TRUE/FALSE

#r #dataframe

Вопрос:

У меня есть следующий фрейм данных под названием studenti:

введите описание изображения здесь

Когда я попытался запустить следующий код:

 maschi = data.frame()
indice = 0

for (i in seq_along(studenti$sesso)) {
    if (studenti$sesso[i] == "M") {
        indice = indice   1
        maschi[indice,] <- studenti[i,]
    }
}
 

появилась следующая ошибка «Ошибка в if () { : отсутствует значение, где требуется TRUE/FALSE».

Моя цель состоит в том, чтобы скопировать в фрейм данных maschi только строки фрейма данных studenti таким образом, чтобы sesso=M.


Редактировать

введите описание изображения здесь


ИЗМЕНИТЬ: вывод dput

 structure(list(sesso = c("F", "M", "M", "M", "M"), altezza = c(168, 
182, 176, 193, 178), peso = c(60, 75, 72, 95, 68), scarpe = c(41, 
43, 45, 45, 45), caso = c(7, 9, 5, 6, 7), matricola = c(1, -1, 
-1, -1, 6), mese = c(11, 5, 9, 5, 7), giorno = c(7, 2, 29, 8, 
12)), row.names = c(NA, 5L), class = "data.frame")
 

Комментарии:

1. Данные, которые вы вставили в конце, не читаются, так как все пробелы исчезли. Можете ли вы использовать dput , чтобы я получил структуру данных

Ответ №1:

Это может быть проще в использовании subset

 maschi <- subset(studenti, sesso == "M")
 

или filter от dplyr

 library(dplyr)
studenti %>%
     filter(sesso == "M")
 

for Цикл можно выполнить с помощью rbind

 maschi <- studenti[0,]
for(i in seq_len(nrow(studenti))) {
     if(studenti$sesso[i] == "M" amp; !is.na(studenti$sesso[i]))  {
        maschi <- rbind(maschi, studenti[i,])
   }
}
 

Кроме того, в коде операции нам просто нужно

 maschi <- studenti[0,]
indice = 0

for (i in seq_along(studenti$sesso)) {
    if (studenti$sesso[i] == "M" amp; !is.na(studenti$sesso[i])) {
        indice = indice   1
        maschi[indice,] <- studenti[i,]
    }
}
 

-выход

 > maschi
  sesso altezza
2     M     182
3     M     176
4     M     193
 

-Обновление с использованием данных обновления операции

 > maschi
  sesso altezza peso scarpe caso matricola mese giorno
2     M     182   75     43    9        -1    5      2
3     M     176   72     45    5        -1    9     29
4     M     193   95     45    6        -1    5      8
5     M     178   68     45    7         6    7     12
 

данные

 studenti <- data.frame(sesso = c("F", "M", "M", "M"), altezza = c(168, 182, 176, 193))
 

Комментарии:

1. Привет @akrun запрос заключается в создании нового фрейма данных с нуля. Выполняет ли команда maschi

2. @Дженнароаргуцци да, это так. Я предполагаю, что вы хотите связать только строки, в которых есть » M » в » sesso

3. зачем ты написал маски Мне должен понадобиться новый индекс вместо i, чтобы поместить строки одну под другой (см. раздел в моем вопросе).

4. @GennaroArguzzi но, почему вы не хотите делать это легко, вместо того, чтобы делать все окольным путем

5. @GennaroArguzzi ваш код также работает, если у нас просто есть maschi <- studenti[0,]