在R中的嵌套数据帧中多次调用ifelse

Vin*_*fer 3 nested r lapply dataframe

我有一个表格的数据框:

LociDT4Length
[[1]]
   Cohort  V1
1:    CEU 237
2:  Lupus 203
3:     RA 298
4:    YRI 278

[[2]]
   Cohort   V1
1:    CEU  625
2:  Lupus  569
3:     RA 1022
4:    YRI  762

[[3]]
   Cohort  V1
1:    CEU 161
2:  Lupus 203
3:     RA 268
4:    YRI 285

[[4]]
   Cohort   V1
1:    CEU 1631
2:  Lupus 1363
3:     RA 1705
4:    YRI 1887
Run Code Online (Sandbox Code Playgroud)

几天前,我学会了这个命令:

with(LociDT4Length[[1]], ifelse(Cohort=="RA", V1/62,
                         ifelse(Cohort=="Lupus", V1/62,
                         ifelse(Cohort=="CEU", V1/96,
                         ifelse(Cohort=="YRI", V1/80,NA)))))
Run Code Online (Sandbox Code Playgroud)

适当地返回结果:

[1] 2.468750 3.274194 4.806452 3.475000
Run Code Online (Sandbox Code Playgroud)

但是,我尝试将此语句置于循环中会为每个嵌套的DF返回一个警告,并返回不正确的结果.错误消息是:

1: In `[<-.data.table`(x, j = name, value = value) :
  Coerced 'double' RHS to 'integer' to match the column's type; may have 
  truncated precision. Either change the target column to 'double' first 
  (by creating a new 'double' vector length 4 (nrows of entire table) and  
  assign that; i.e. 'replace' column), or coerce RHS to 'integer' (e.g. 1L,  
  NA_[real|integer]_, as.*, etc) to make your intent clear and for speed.
  Or, set the column type correctly up front when you create the table and 
  stick to it, please.
Run Code Online (Sandbox Code Playgroud)

所以,我想要弄清楚如何使用如下语句重复应用此语句:

for (i in 1:length(LociDT4Length)){
  with(LociDT4Length[[i]], ifelse(Cohort=="RA", V1/62,
                           ifelse(Cohort=="Lupus", V1/62,
                           ifelse(Cohort=="CEU", V1/96, 
                           ifelse(Cohort=="YRI", V1/80,NA)))))
}
Run Code Online (Sandbox Code Playgroud)

或者我想使用lapply将此语句应用于此嵌套数组中的46个嵌套DF.

有什么建议?如果ifelse语法很差且很笨重,我也愿意改变它.

非常感谢.

zx8*_*754 6

这应该工作:

lapply(LociDT4Length, function(x)
  with(x,ifelse(Cohort %in% c("RA","Lupus"), V1/62,
                ifelse(Cohort=="CEU", V1/96,
                       ifelse(Cohort=="YRI", V1/80,NA)))))
Run Code Online (Sandbox Code Playgroud)

为了避免嵌套,ifelse试试这个:

#define cohort and matching divisor
origin=c("RA","Lupus","CEU","YRI")
divisor=c(62,62,96,80)

#avoid ifelse
lapply(LociDT4Length, function(x)
  with(x,V1/divisor[match(Cohort,origin)]))
Run Code Online (Sandbox Code Playgroud)