У меня есть таблица данных R. с столбцом id и несколькими столбцами, определяющими упорядоченный пороговый уровень и соответствующее значение. То, что я хотел бы сделать, это искать для каждой строки первый уровень, который больше или равен параметру для этого id и возвращает соответствующее значение.R data.table упорядоченный поиск столбца
Вот пример набора данных.
DT<-data.table(id=c("Obs1","Obs2"),
level.1=c(1,1),level.2=c(2,4),level.3=c(3,8),
val.1=c(10,10),val.2=c(20,30),val.3=c(30,50))
DT
id level.1 level.2 level.3 val.1 val.2 val.3
1: Obs1 1 2 3 10 20 30
2: Obs2 1 4 8 10 30 50
Таким образом, если параметры подстановки:
params<-list("Obs1"=2.5,"Obs2"=1)
значения должны быть возвращены:
c(30,10).
Я хотел бы также, как количество уровней и значений, несколько произвольно, хотя они будет удовлетворять соглашению об именах, аналогично примеру
Я могу решить это, используя несколько шаги, но это очень некрасиво и, вероятно, не очень вычислительно эффективным:
level.names<-colnames(DT)[grep("level",colnames(DT))]
val.names<-colnames(DT)[grep("val",colnames(DT))]
setkey(DT,id)
idx<-DT[,grep(TRUE,lapply(.SD,function(y)((params[[id]] <= y))))[1],
.SDcols=level.names,by=id]
values<-ifelse(is.na(idx$V1),as.numeric(NA),DT[,get(val.names[idx[id,V1]]),by=id]$V1)
ранее я решил эту проблему, используя data.frames гораздо более аккуратно, используя plyr :: ddply и тот факт, что я мог бы использовать имена переменных для столбцы в data.frame. (Для краткости я не включаю это решение здесь.)
Любые предложения по улучшению приветствуются.
Спасибо! Оба решения - это значительные улучшения. Знать о расплавах и прокатных соединениях будет очень полезно в будущем. – mjreed