Условие проверки R для многих строк

#r #loops

#r #циклы

Вопрос:

 d=data.frame("STUDENT"=c(1,2,3,4),
             "SCORE1"=c(64,68,65,65),
             "SCORE2"=c(91,78,94,55),
             "SCORE3"=c(84,62,73,61),
             'IMPROVE'=c('T','T','T','F'))

d$IMPROVE1 = ifelse(d[d$STUDENT==1,d$SCORE1] < d[d$STUDENT==1,d$SCORE2] | d[d$STUDENT==1,d$SCORE3], T, F)
  

Я стремлюсь создать УЛУЧШЕНИЕ, которое отличается для каждого ученика. Оно равно T, если у УЧЕНИКА SCORE2 или SCORE3 больше SCORE1. Оно равно F, если у УЧАЩЕГОСЯ нет SCORE2 или SCORE3, превышающих SCORE1. Я предоставляю свои образцы данных и пытаюсь.

Ответ №1:

Вы можете сделать :

 d$IMPROVE1 <- FALSE
d$IMPROVE1[d$SCORE1 < d$SCORE2 | d$SCORE1 < d$SCORE3] <- TRUE
d
>  STUDENT SCORE1 SCORE2 SCORE3 IMPROVE IMPROVE1
1       1     64     91     84       T     TRUE
2       2     68     78     62       T     TRUE
3       3     65     94     73       T     TRUE
4       4     65     55     61       F    FALSE
  

Для любого количества баллов :

 scores <- grep("SCORE", colnames(d), value = TRUE)[-1]
sapply(1:nrow(d), function(s) any(d$SCORE1[s] < d[s,scores]))
  

Для известных столбцов оценки, как указано в комментариях:

 column_scores <- 3:4
column_ref <- 2
sapply(1:nrow(d), function(s) any(d[s, column_ref] < d[s, column_scores]))
  

Ответ №2:

Вывод логического выражения не требует никаких изменений

 d$IMPOROVE1 <- with(d, (SCORE1 < SCORE2) | (SCORE1 < SCORE3))
d$IMPROVE1
#[1]  TRUE  TRUE  TRUE FALSE
  

Кроме того, для нескольких столбцов векторизованным подходом было бы создание логического вектора rowSums с помощью логического matrix созданного путем сравнения одного столбца с несколькими другими столбцами «ОЦЕНКА»

 rowSums(d$SCORE1 < d[grep("SCORE", names(d))][-1]) > 0
#[1]  TRUE  TRUE  TRUE FALSE
  

Ответ №3:

попробуйте это

 d$IMPROVE1 = ifelse(d$SCORE1 < d$SCORE2 |d$SCORE1 < d$SCORE3, T, F)
  

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

1. Этот приятный @Cettt предположим, у меня было 10 тестов, могу ли я эффективно закодировать это, используя [,] вместо имени столбца?

2. Извините, я не знаю, что вы подразумеваете под «использованием [.] вместо».

3. Таким образом, я не хочу называть SCORE1, SCORE2, SCORE3, SCORE4 и так далее и тому подобное, если мне нужно проверить улучшение на 10 БАЛЛОВ. Итак, под [,] я подразумеваю, что если использовать позицию вместо имени, например, 1:10 вместо SCORE1 до SCORE10.

4. Вы имеете в виду, что хотите знать, хуже ли первая оценка, чем все последующие оценки?

5. Да, но их более 10, поэтому не нужно каждый раз записывать ОЦЕНКУ, поэтому в основном сравните SCORE1 для STUDENT1 со всеми ДРУГИМИ ОЦЕНКАМИ для STUDENT1 и сделайте это для всех СТУДЕНТОВ. Приветствия!