我试图了解如何正确格式化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