r语言 - do的格式.调用语句



我试图了解如何正确格式化lapply, rbind和do的组合。调用语句却无法使语句正常运行。我提供了一个简单的示例函数和数据,我用它来尝试理解格式。我完全理解我提供的场景可以使用更简单的方法来运行,这样做的目的是简单地理解格式以及如何在自定义函数上使用lapply和rbind。

下面是一些测试数据:

facility_id  patient_number  test_result
123          1000            25
123          1000            30
25           1001            12
25           1002            67
25           1010            75
65           1009            8
22           1222            95
22           1223            89

我基本上试图使用设施id值列表将数据子集在自定义函数中,然后想将每个数据表绑定在一起,从自定义函数产生。

下面是我使用的代码:
facilities_id_list<-c(123, 25)
facility_counts<-function(facilities_id_list){
facility<-facilities_id_list[[i]]
subset<-data[facility_id==facility]
}
results <- do.call("rbind", lapply(seq_along(facilities_id_list), function(i) facility_counts)

我希望达到的结果:

facility_id  patient_number  test_result
123          1000            25
123          1000            30
25           1001            12
25           1002            67
25           1010            75

为什么不工作?我需要更改格式吗?

不使用==,使用%in%直接子集

subset(data, facility_id %in% facilities_id_list)

在OP的代码中,有多个问题- 1)输入参数是facilities_id_list,其中在lapply中,我们正在循环序列i., 2)facility_id==facility应该是data$facility_id==facility,因为我们正在使用[并且没有数据绑定,3)我们需要指定我们使用行索引子集默认情况下没有任何,,它被视为data.frame中的列索引

facility_counts<-function(i){
facility<-facilities_id_list[[i]]
data[data$facility_id == facility, ]
}
> do.call(rbind, lapply(seq_along(facilities_id_list), facility_counts))
facility_id patient_number test_result
1         123           1000          25
2         123           1000          30
3          25           1001          12
4          25           1002          67
5          25           1010          75

下面是使用普通旧filter的示例,然后是使用do.call()的自定义函数的另一个选项:

library(dplyr)

# data
df <- tibble::tribble(
~facility_id, ~patient_number, ~test_result,
123L,           1000L,          25L,
123L,           1000L,          30L,
25L,           1001L,          12L,
25L,           1002L,          67L,
25L,           1010L,          75L,
65L,           1009L,           8L,
22L,           1222L,          95L,
22L,           1223L,          89L
)
facilities_id_list<-c(123, 25)
# simplest solution: just using filter
df %>% 
filter(facility_id %in% facilities_id_list)
#> # A tibble: 5 × 3
#>   facility_id patient_number test_result
#>         <int>          <int>       <int>
#> 1         123           1000          25
#> 2         123           1000          30
#> 3          25           1001          12
#> 4          25           1002          67
#> 5          25           1010          75
# using custom function + do.call
custom_filter <- function(data) {
data %>% 
filter(facility_id %in% facilities_id_list)
}
do.call(custom_filter, list(df))
#> # A tibble: 5 × 3
#>   facility_id patient_number test_result
#>         <int>          <int>       <int>
#> 1         123           1000          25
#> 2         123           1000          30
#> 3          25           1001          12
#> 4          25           1002          67
#> 5          25           1010          75

相关内容

  • 没有找到相关文章

最新更新