长时间读者第一次提交者。我对R比较陌生,我正在尝试完成今天应该完成的重要部分的项目中间:)。
我正在尝试遍历data.table并将一个函数应用于data.table的每一行。对我来说奇怪的是,我可以单独传递每个值并且它可以工作但是当我尝试使用lapply et迭代时。人。或者for循环我无法使函数起作用。我试图尽可能多地包含信息代码等。我道歉了。
包含捐赠者信息的data.table。我掩盖了donor_id。
> str(testdonors)
Classes ‘data.table’ and 'data.frame': 22 obs. of 34 variables:
$ donor_id : Factor w/ 455 levels "XXYYWWW","WWWXXYY",..: 281 282 283 284 285 286 289 290 291 292 ...
$ Date_of_Death : POSIXct, format: "2012-01-03" "2012-01-03" "2012-01-02" "2012-01-02" ...
$ rec_out_us : int 0 0 0 0 0 0 0 0 0 0 ...
$ age : num 20.1 22.9 54.3 28.7 43.4 ...
$ gender : Factor w/ 2 levels "Female","Male": 2 2 1 2 1 2 2 2 1 2 ...
$ race : Factor w/ 4 levels "Black","Hispanic",..: 4 4 4 2 4 2 4 3 4 2 ...
$ cause_death : Factor w/ 4 levels "Anoxia","Other Cause",..: 1 4 3 3 1 3 3 4 3 4 ...
$ circum_death : Factor w/ 5 levels "Homicide","Natural",..: 4 5 2 2 3 2 2 1 2 5 ...
$ method_death : Factor w/ 7 levels "Asphyxiation",..: 1 5 7 7 6 7 7 4 7 5 ...
$ blood_type : Factor w/ 4 levels "A","AB","B","O": 4 4 1 4 1 4 4 2 1 4 ...
$ bmi : num 20.4 19.6 24.9 27.4 25.7 ...
$ serum_creat : num 0.69 1.8 0.64 0.81 0.7 1.31 2.67 0.6 0.57 0.95 ...
$ hb_core_anti : int 0 0 1 0 0 0 0 0 0 0 ...
$ hb_surface_anti : int 0 0 0 0 0 0 0 0 0 0 ...
$ hc_anti : int 0 0 0 0 0 0 0 0 0 0 ...
$ cis_blood : int 0 0 0 0 0 0 0 0 0 0 ...
$ cis_lung : int 0 0 0 0 0 0 0 0 0 0 ...
$ cis_urine : int 0 0 0 0 0 0 0 0 0 0 ...
$ cis_other : int 0 0 0 0 0 0 0 0 0 0 ...
$ dcd_non_hb : int 0 1 0 1 1 0 0 0 0 0 ...
$ dcd_controlled : int 0 1 0 1 1 0 0 0 0 0 ...
$ ca_after_bd : int 0 0 0 0 0 0 0 0 0 0 ...
$ lung_p02 : num 117 63 143 104 379 ...
$ cigarette_use : int 0 0 0 0 0 0 0 0 0 0 ...
$ cigarette_use_6mos: int 0 0 0 0 0 0 0 0 0 0 ...
$ cocaine_use : int 0 0 0 0 1 0 1 0 0 0 ...
$ cocaine_use_6mos : int 0 0 0 0 0 0 1 0 0 0 ...
$ drug_use_other : int 1 1 1 0 1 0 1 0 0 0 ...
$ heavy_alcohol : int 0 0 0 0 1 0 0 0 0 0 ...
$ high_risk_donor : int 1 0 1 0 0 0 0 0 0 0 ...
$ history_diabetes : int 0 0 0 0 0 0 0 0 0 0 ...
$ insulin_dep : int 0 0 0 0 0 0 0 0 0 0 ...
$ history_hypten : int 0 0 1 0 0 0 0 0 0 0 ...
$ history_cancer : int 0 0 0 0 0 0 0 0 0 0 ...
- attr(*, "sorted")= chr "donor_id"
- attr(*, ".internal.selfref")=<externalptr>
功能1
calc_donor_yield <- function(p_model_id, p_donor){
heart_yield <- calc_heart_yield(p_model_id, p_donor)
...
}
功能2
calc_heart_yield <- function(p_model_id, p_donor){
if(p_donor[, hb_core_anti == 1 || hb_surface_anti == 1 || hc_anti == 1]){
heart_yield = 0.0036
} else {
heart_yield <- get_organ_yield(p_model_id,"heart_coeff",p_donor)
}
heart_yield
}
这个有效! test1&lt; - calc_donor_yield(1,testdonors [2,])
这些不......
lapply(testdonors["donor_id",], function(x) calc_donor_yield(1,x))
Error in NextMethod("[") : object 'hb_core_anti' not found
Called from: (function ()
{
.rs.breakOnError(TRUE)
})()
lapply(testdonors[list(donor_id),],function(donor) calc_donor_yield(1,donor))
Error in NextMethod("[") : object 'hb_core_anti' not found
Called from: (function ()
{
.rs.breakOnError(TRUE)
})()
在这两个调用中,看起来p_donor只是data.table的第一个元素。
我也尝试过for循环
results <- for (n in 1:nrow(testdonors)) calc_donor_yield(1,testdonors[donorIDlist[n]])
返回NULL
感谢您提供任何帮助。如果有任何其他详细信息需要帮助我们解答,请告诉我。
答案 0 :(得分:0)
或简单命令
test1 <- calc_donor_yield(1,testdonors[2,])
有效,因为你传递的是data.table / data.frame的一行,它本身就是一个data.table。
致电时
lapply(testdonors["donor_id",], function(x) calc_donor_yield(1,x))
我认为您打算获取donor_id列,而不是名为&#34; donor_id&#34;的行,因此确实应该是
lapply(testdonors[,"donor_id"], function(x) calc_donor_yield(1,x))
只将donor_id列的值传递给x值,而不是data.frame的整行。
我相信您的循环理念是最接近的,但您的索引编制不正确,您无法以这种方式分配结果。 <怎么样
results<- lapply(1:nrow(testdonors), function(n) {
calc_donor_yield(1,testdonors[n,])
})
在这里,您将传递一行索引为calc_donor_yield(1,testdonors[n,])
,就像您在简单示例中所做的那样calc_donor_yield(1,testdonors[2,])