我有一些数据的列表,它看起来像:
library(data.table)
dt1 <- data.table(age_group = c("young", "old"), ratio = runif(2))
dt2 <- data.table(age_group = c("young", "old"), ratio = runif(2))
dt_list <- list(
list(ratio_by_group = dt1),
list(ratio_by_group = dt2),
list(ratio_by_group = NA)
)
dt_list
[[1]]
[[1]]$ratio_by_group
age_group ratio
1: young 0.5956572
2: old 0.5053023
[[2]]
[[2]]$ratio_by_group
age_group ratio
1: young 0.4632962
2: old 0.2356656
[[3]]
[[3]]$ratio_by_group
[1] NA
我希望精确获取特定群体(即“年轻”)的比率信息并将其作为向量返回。我使用了以下代码:
sapply(dt_list, function(x) ifelse(!is.na(x$ratio_by_group), x$ratio_by_group[age_group=='young', ratio], NA))
[,1] [,2]
[1,] 0.5956572 0.4632962
[2,] 0.5956572 0.4632962
[3,] 0.5956572 0.4632962
[4,] 0.5956572 0.4632962
我的预期输出是
[1] "0.5956572" "0.4632962" NA
使用递归:
fn <- function(x){
if(is.data.table(x)) x[age_group == 'young', ratio]
else if(is.list(x[[1]])) unlist(lapply(x, fn),use.names = FALSE)
}
fn(dt_list)
[1] 0.6224014 0.8436315