R语言 语句的格式do.call

yhxst69z  于 2023-01-15  发布在  其他
关注(0)|答案(2)|浏览(128)

我试图理解如何在语句中正确格式化lapply、rbind和www.example.com的组合do.call,但无法使语句正常运行。我提供了一个简单的示例函数和数据,用于尝试理解使用的格式化。我完全理解,可以使用更简单的方法运行我提供的场景。这样做的目的是为了简单地理解格式以及如何在自定义函数上使用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

我实际上是尝试使用一个facility 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

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

zbq4xfa0

zbq4xfa01#

使用%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
qeeaahzv

qeeaahzv2#

下面是一个使用普通的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

相关问题