#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 и сделайте это для всех СТУДЕНТОВ. Приветствия!