#r #dataframe #purrr #pmap
Вопрос:
Я пытаюсь запустить функцию для вычисления доли времени в указанном диапазоне для каждой строки во фрейме данных с помощью purrr::pmap, однако один из аргументов исходной функции-11 столбцов. Это означает, что функция отлично работает в одной строке, но при повторении каждой строки она завершается ошибкой:
df_test <- structure(list(duration = c(268, 264, 256, 200, 296, 60, 16,
396, 400, 388), d1 = c(22.4, 12.4, 15.6, 21.6, 15.2, 2, 1.2,
2.4, 2, 1.6), d2 = c(25.2, 16, 16.8, 28.4, 16.8, 2, 1.6, 2.4,
2, 2), d3 = c(24.8, 18.4, 16.4, 28, 16.4, 2, 1.6, 2.4, 2, 2),
d4 = c(21.6, 20.4, 18, 24.4, 16.4, 2, 1.6, 2.8, 2, 1.6),
d5 = c(24.4, 20.4, 19.2, 25.2, 17.6, 1.6, 1.6, 2.8, 2, 2),
d6 = c(24.8, 19.6, 18.8, 24, 19.2, 1.6, 1.6, 2.8, 2, 2),
d7 = c(22.8, 19.6, 18, 23.6, 18.8, 1.6, 2, 2.8, 2.4, 1.6),
d8 = c(17.6, 18.4, 17.6, 22.4, 20.8, 1.6, 2, 2.8, 2.4, 2),
d9 = c(20.4, 16.4, 16.8, 20.4, 23.2, 1.6, 2, 2.8, 2.4, 2),
d10 = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), d11 = c(NA_real_,
NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
NA_real_, NA_real_, NA_real_), bottom = c(18.02, 14.03, 14.03,
20.3, 18.95, 4.54, 4.54, 4.54, 4.54, 4.54)), row.names = c("5",
"6", "7", "9", "10", "17", "18", "19", "20", "21"), class = "data.frame")
prop_fun <- function(time, d, bottom, mini=5, maxi=25 ) {
#temp = df[i,]
Secs = seq(from=0, to=time, by=1) # create sequence of one second intervals
DT = seq(from = 0, to=time, by=time/10)
if(is.na(d[11])){
DD = data.frame(c(0, d[1:9], 0))
# interpolate d
d.reg = approx(DT, DD, xout=Secs)$y
d.regS = bottom-d.reg
output = length(d.regS[d.regS>mini amp; d.regS<maxi ])/time
} else {
DD = data.frame(c(0, d[1:11], 0))
d.reg = approx(DT, DD, xout=diveSecs)$y
d.regS = bottom-d.reg
output = length(d.regS[d.regS>mini amp; d.regS<maxi ])/time
}
return(output)
}
prop_fun(df_test$duration[1], df_test[1,2:12],df_test$bottom[1])
# [1] 0.1268657
argument_list <- list(time=df_test$duration, d=df_test[,2:12],bottom=df_test$bottom, mini=5, maxi=25 )
try <- purrr::pmap(argument_list, prop_fun)
#Error: Element 2 of `.l` must have length 1 or 10, not 11
Не совсем уверен, чем отличаются входные данные между одиночным запуском и аргументом списка для purrr::pmap. Нужно ли мне просто включать все отдельные столбцы в качестве отдельных аргументов prop_fun
и объединять их внутри ?
Ответ №1:
длина(df) = ncol(df), но я думаю, что вы хотите передать каждую строку в свою функцию. Вы можете извлечь список строк с помощью:
d = lapply(1:nrow(df_test[, 2:12]), function(x) df_test[x, 2:12])
Конечно, purrr::pmap
вы также можете собрать все в data.frame или tibble и передать дальше:
tibble::tibble(
time = df_test$duration,
bottom = df_test$bottom,
d = lapply(1:nrow(df_test[, 2:12]), function(x) df_test[x, 2:12]),
mini = 5,
maxi = 25
) %>%
purrr::pmap(prop_fun)