如何将自定义函数应用于嵌套数据框?

问题描述 投票:0回答:1

我正在尝试将自定义函数应用于嵌套数据框

我想应用机器学习算法来预测NA值

经过一些在线阅读后,似乎map函数最适用于此处

我有一段代码嵌套了数据框,然后将数据拆分为测试(data3)和训练(data2)集-测试数据集包含要预测的列的所有空值,并且训练包含所有不为null的值都将用于训练ML模型]

dmaExtendedDataNA2 <- dmaExtendedDataNA %>%
                  group_by(dma) %>%
                  nest() %>%
                  mutate(data2 = map(data, ~filter(., !(is.na(mean_night_flow)))),
                         data3 = map(data, ~filter(., is.na(mean_night_flow))))

这是我打算使用的功能:

    my_function (test,train) {
             et  <- extraTrees(x = train, y = train[, "mean_night_flow"], na.action = "fuse", ntree = 1000, nodesize = 2, mtry = ncol(train) * 0.9 )
             test1 <- test
             test1[ , "mean_night_flow"] <- 0
             pred  <- predict(et, newdata = test1[, "mean_night_flow"])
             test1[ , "mean_night_flow"] <- pred
             return(test1)

我尝试了以下代码,但是它不起作用:

dmaExtendedDataNA2 <- dmaExtendedDataNA %>%
                      group_by(dma) %>%
                      nest() %>%
                      mutate(data2 = map(data, ~filter(., !(is.na(mean_night_flow)))),
                             data3 = map(data, ~filter(., is.na(mean_night_flow))),
                             data4 = map(data3, data2, ~my_function(.x,.y)))

它出现以下错误:

Error: Index 1 must have length 1, not 33

这表明它期望的是列而不是整个数据框。我该如何使用它?

非常感谢

r dplyr purrr broom
1个回答
0
投票

没有对数据进行测试,我认为您使用的是错误的map函数。 purrr::map处理one参数(一个列表,一个向量,无论如何)并返回一个列表。您正在向它传递两个值(data3data2),因此我们需要使用:

dmaExtendedDataNA2 <- dmaExtendedDataNA %>%
                      group_by(dma) %>%
                      nest() %>%
                      mutate(data2 = map(data, ~filter(., !(is.na(mean_night_flow)))),
                             data3 = map(data, ~filter(., is.na(mean_night_flow))),
                             data4 = map2(data3, data2, ~my_function(.x,.y)))

[如果发现自己需要两个以上,则需要pmap。您可以将pmap用于1或2个参数,实际上是相同的。从map迁移到pmap的两个最大区别是:

  • 您的参数需要包含在列表中,所以

    map2(data3, data12, ...)
    

    成为

    pmap(list(data3, data12), ...)
    
  • 您用双点号位置引用它们,..1..2..3等,所以>

    ~ my_function(.x, .y)
    

    成为

    ~ my_function(..1, ..2)
    
© www.soinside.com 2019 - 2024. All rights reserved.