Вы можете написать функцию, которая определяет выходные данные для каждой комбинации входов.
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