我目前正在尝试将列表中存储的函数应用于与具有相同列数的数据框的数据框中,以将每个函数应用于与其等效的列。
例如,在这种情况下,我有一个包含5列的数据框,并且每一列都必须根据某些规范验证其数据。因此,我有以下示例数据集:
>my_data
# A tibble: 4 x 5
`Payee Name` `SAP Vendor #` Amount `Invoice Date` `Invoice #`
<chr> <chr> <chr> <chr> <chr>
1 X COMPANY 134 65.64 11/16/2019 89724404
2 X COMPANY 134 197.68 11/15/2019 89724470
3 X COMPANY 134 247.63 11/15/2019 89724300
4 X COMPANY 134 215.34 11/14/2019 89579028
为了验证它们,我声明了以下函数并将其保存到列表中
payee_name <- function(a){grepl("^[\\w &-]+$", perl = TRUE, a)}
vendor_no <- function(a){grepl("^\\d{3}$", perl = TRUE, a)}
amount <- function(a){grepl("^-?\\d+\\.\\d{2}$", perl= TRUE, a)}
date_val <- function(a){
grepl(
paste(
# Month validation
"(0[1-9]|1[012])",
# Day validation
"(0[1-9]|[12][0-9]|3[01])",
# Year validation
"(19[6-9][0-9]|20[0-9]{2})",
# / required by format as separator
sep = "/"
),
a
)
}
invoice_val <- function(a){grepl("^\\d{8}$", perl = TRUE, a)}
fun_lst <- list(
payee_name,
vendor_no,
amount,
date_val,
invoice_val
)
我想获得一个逻辑数据框/矩阵,其中包含TRUE / FALSE,这取决于测试列的结果。到目前为止,我一直在做的事情是创建一个与原始数据帧具有相同维度的矩阵,并用sapply将列替换为结果。
my_data_results <- matrix(NA, nrow(my_data), ncol(my_data))
colnames(my_data_results) <- colnames(my_data)
for(i in 1:ncol(my_data)){
my_data_results[,i] <- sapply(my_data[,i], fun_lst[[i]])
}
我相信可能会有更好的方法,因为我想对其进行扩展以使其与嵌套在列表中的数据帧一起使用,并且目前这样做变得很麻烦。