我正在尝试将自定义函数应用于嵌套数据框
我想应用机器学习算法来预测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
这表明它期望的是列而不是整个数据框。我该如何使用它?
非常感谢
没有对数据进行测试,我认为您使用的是错误的map
函数。 purrr::map
处理one参数(一个列表,一个向量,无论如何)并返回一个列表。您正在向它传递两个值(data3
和data2
),因此我们需要使用:
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)