Условия, вложенные в группы - PullRequest
0 голосов
/ 25 октября 2018

Я работаю с некоторыми данными, подобными этим:

ID    Count  Report  Rank   
X-01   1      4.2     2 
X-01   2      2.7     1     
X-01   3      5.8     3 
X-01   4      14      5 
X-01   5      9.2     4
X-02   1      6.8     2 
X-02   2      17      4     
X-02   3      13      3 
X-02   4      22.7    5 
X-02   5      4       1

Подсчет относится к моменту срабатывания датчика, Отчет - это значение, Ранг - это рейтинг в Отчете.

Яинтересует 6 переменных из этого:

If Count = 1 and Rank = 1 then Report
If Count = 1 and Rank = 2 then Report
If Count > 1 and Rank = 1 or 2, then -1
If Count = 1 and Rank = 3:5, -Report
If Count >= 2 and Rank = 3:10, 1
If Rank > 5 (there are multiple rows to each ID), 0

Я пробовал if (x) {} else if () {} и т. д. и ifelse () с несколькими гнездами, но получаю много красного текста назад!

Larger object length is not a multiple of shorter object length 

часто.

Пока единственное решение, которое я нашел, - это вычислить каждое в столбце через 'ifelse', а затем сложить строки в новом столбце, которыйэто отнимает много времени и не элегантно.

Есть идеи?

1 Ответ

0 голосов
/ 25 октября 2018

Вы можете написать функцию, которая определяет выходные данные для каждой комбинации входов.

f1 <- function(count, rank, report){

  # in case of missing count or rank data:
  if (is.na(count) | is.na(rank)) return(NA)
  if (count==1 & rank %in% 1:2) return(report)
  if (count > 1 & rank %in% 1:2) return(-1)
  if (count==1 & rank %in% 3:5) return(-report)
  if (count >= 2 & rank %in% 3:10) return(1)
  if (rank > 5) return(0)
  return(NA)
}

Далее вы можете использовать mapply, чтобы применить эту функцию к вашему data.frame.

mapply(f1, count=d$Count, rank=d$Rank, report=d$Report)
[1]  4.2 -1.0  1.0  1.0  1.0  6.8  1.0  1.0  1.0 -1.0

Редактировать: Я обновил функцию, чтобы она возвращала NA, если некоторые из входных переменных NA.

Учитывая этот набор данных:

d <- read.table(text='ID    Count  Report  Rank   
                      X-01   1      4.2     2 
                      X-01   2      2.7     1     
                      X-01   3      5.8     3 
                      X-01  NA      4       2
                      X-01   2      5.5     NA
                      X-01   4      14      5 
                      X-01   5      9.2     4
                      X-02   1      6.8     2 
                      X-02   2      17      4     
                      X-02   3      13      3 
                      X-02   4      22.7    5 
                      X-02   5      4       1', header=T)

Я получаю этот вывод:

mapply(f1, count=d$Count, rank=d$Rank, report=d$Report)
[1]  4.2 -1.0  1.0   NA   NA  1.0  1.0  6.8  1.0  1.0  1.0 -1.0
...