迭代通过R data.table尝试调用函数的问题

时间:2014-05-02 18:32:33

标签: r data.table

长时间读者第一次提交者。我对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

感谢您提供任何帮助。如果有任何其他详细信息需要帮助我们解答,请告诉我。

1 个答案:

答案 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,])