Многостолбцовый data.frame в качестве аргумента списка для 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 & 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 & 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 и объединять их внутри?


person Jojo    schedule 17.03.2021    source источник


Ответы (1)


length (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)
person Will Oldham    schedule 17.03.2021
comment
Это билет, спасибо. - person Jojo; 17.03.2021