Тестовое условие R для многих рядов - PullRequest
1 голос
/ 09 апреля 2019
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, если STUDENT не имеет SCORE2 или SCORE3 больше, чем SCORE1. Я даю свои данные образца и пытаюсь.

Ответы [ 3 ]

1 голос
/ 09 апреля 2019

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

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]))
1 голос
/ 09 апреля 2019

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

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

Кроме того, для нескольких столбцов векторизованный подход будет создавать логический вектор с rowSums из логического matrix создан путем сравнения одного столбца с несколькими другими столбцами 'SCORE'

rowSums(d$SCORE1 < d[grep("SCORE", names(d))][-1]) > 0
#[1]  TRUE  TRUE  TRUE FALSE
0 голосов
/ 09 апреля 2019

попробуйте

d$IMPROVE1 = ifelse(d$SCORE1 < d$SCORE2 |d$SCORE1 < d$SCORE3, T, F)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...