データフレームへの適用は1つの行に対して機能しますが、複数の行への適用はその特定の行に対して失敗します。例を次に示します(行954は単独で機能します)。
apply(dx[954,], 1, query.db)
2571
1092 0.06044147
3890 0.05948577
3273 0.05911261
794 0.05855583
4241 0.05854064
3560 0.05602690
ただし、data.frame内の残りの1つ以上の行と組み合わせると、行954はnumeric(0)を返します。
apply(dx[954:955,], 1, query.db)
$`2571`
numeric(0)
$`1194`
908 3754 5119 2835 3139 2775
0.028935504 0.026941886 0.024762815 0.023335049 0.021892711 0.021001654
1101 1762 401 3899 3727 4248
0.020434257 0.020413724 -0.083333333 0.020111260 0.019872379 0.019840807
3282 4585 798 5249 836 3570
0.019729315 0.019524213 0.019440097 0.019410513 0.019288864 0.019052412
726 3663 4775 3030 4938 3259
0.018894556 0.018838258 0.018749506 -0.083333333 0.018416353 0.018240173
1426 4563 3871 958 1242 1033
これが私が使用している関数です(<<-、別々の関数でそれらの変数にアクセスする必要があります!書き直しに関する提案は大歓迎です!an-line関数を書き直そうとした私の試みを見ることができます。動作せず、コメントアウトされています。
query.db <- function(dxdf){
snquery = dbSendQuery(connection, paste("select distinct cpt4code from DxRxLookup where icd9code = '", dxdf[4], "'", sep = ""))
cptcodes <<- dbGetResult(snquery)
if(dim(cptcodes)[1] == 0){
return (0)
}
#restrict this to constrain by Rx1 and Rx2 inputs
h1 <- which(cpt$Cpt %in% cptcodes[,1])
y <- which((cpt$Rx2 %in% dxdf[2] | cpt$Rx1 %in% dxdf[2]) & (cpt$Rx1 %in% dxdf[3] | cpt$Rx2 %in% dxdf[3]))
hits <- intersect(y, h1)
sum.all.hits <<- sum(cpt[hits,]$Log.Odds.Ratio)
miss <<- 1 / (length(y) - length(hits))
# apply(cpt[y,], 1, function(cptdf) if (cptdf[4] %in% codes[,1]){ P.hit <- as.numeric(cptdf[6]) / sum.of.hits; return (P.hit)} else { return (-m)}, c(codes=cptcodes, sum.of.hits=sum.all.hits, m=miss))
apply(cpt[y,], 1, calc.enrichment)
}