我有兩個data.table(s)DT1和RF,其中DT1是主表,RF是變量值的crosswalk。如何傳遞列名作爲來自其他列表的輸入並引用其他data.table來總計分數?
DT1 <- data.table(id = c(1:10),Var1=c(1,0,0,0,1,0,1,1,0,0) ,Var2=c(0,0,0,0,1,0,1,0,0,1),
Var3=c(1,1,1,0,0,0,1,1,0,0),Var4=c(1,1,0,0,1,0,0,0,0,0),
Var5=c(0,0,0,0,1,0,1,1,0,0))
RF <- data.table (Variable = c("Var1","Var2","Var3","Var4","Var5","Var6","Var7","Var8",
"Var9","Var10"),
CO = c(1.1,2.3,1.4,1.5,1.0,3.8,2.5,3.7,2.1,2.0),
IN = c(2.1,1.3,1.9,2.5,1.7,2.8,2.9,1.7,1.1,2.0))
欲計算在DT1模型CO和其中添加劑,並會採取不同的變量作爲兩者的模型輸入一個得分列。對於我創建的變量列出了兩種型號:
List1 <- c("Var1","Var3","Var5")
List2 <- c("Var1","Var2","Var6","Var7","Var8")
所以,如果我計算Score_CO那麼我的工作,應在列表1檢查變量。像在DT1每一行應該檢查是否
1) Var1 == 1, If yes,
2) then check for that in RF for RF$Variable == Var1, if yes
3) get RF$CO value,
4) else return (0)
我已經嘗試了兩種方法尚未:
METHOD 1:
L1<- length(List1)
y<-0
DT1 <-DT1[,Score_CO:={for(i in 1:L1){
x<-parse(text = List1[i])
if(DT1[,eval(x)] == 1){
x<-RF[which(RF[,'Variable'] == List1[i],),CO]}
else{as.numeric(0.0)}
y=y+x }
return(y)}]
METHOD 2:
Score_Calc<-function(DT,RF, List, model = 'CO'){
pvar<- 0
pvar<-for(i in 1:nrow(DT)){
for(j in 1:length(List)){
x<-parse(text = List[j])
ifelse(DT[i,eval(x)] == 1, RF[which(RF[,'Variable'] == List[j],),model], 0)
}
pvar <- pvar + pvar
DT[,paste0('Score_',model):= pvar]
}
return(DT)
}
Score_Calc(DT=DT1,RF = RF, List=List1, model = 'CO')
但我沒有得到結果。輸出應該是:
OUTPUT:
id Var1 Var2 Var3 Var4 Var5 Score_CO
1 1 0 1 1 0 2.5
2 0 0 1 1 0 1.4
3 0 0 1 0 0 1.4
4 0 0 0 0 0 0
5 1 1 0 1 1 2.1
6 0 0 0 0 0 0
7 1 1 1 0 1 3.5
8 1 0 1 0 1 3.5
9 0 0 0 0 0 0
10 0 1 0 0 0 0
P.S:Score_CO = VAR1 + VAR2 + VAR3(從RF表CO列中的值)
請看看,幫我找到我在做什麼錯。任何幫助表示讚賞。
由於它看起來不錯,我只是想 問我如何才能使用List1中的變量獲取DT1的子集。因爲對於CO,我只想檢查列表1(Var1,Var3,Var5)中的變量並添加它們。 – nsDataSci
非常感謝,非常感謝。 – nsDataSci
@nsDataSci,如果這回答你的問題,請考慮通過點擊複選框將其標記爲已回答。謝謝。 – BrodieG