将列表中的每个功能应用于数据框上的相应列

时间:2019-11-21 18:01:00

标签: r dataframe apply

我目前正在尝试将列表中存储的函数应用于与具有相同列数的数据框的数据框中,以将每个函数应用于与其等效的列。

例如,在这种情况下,我有一个包含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]])
}

我相信可能会有更好的方法,因为我想对其进行扩展以使其与嵌套在列表中的数据帧一起使用,并且目前这样做变得很麻烦。

0 个答案:

没有答案