将函数应用于多个列表 (R)

applying a function to multiple lists (R)

我有两个列表:

source <- list(c(5,10,20,30))
source.val <- list(c('A', 'B', 'C', 'D'))

source中的每个对应元素在source.val中都有对应的值。我想从上面的两个文件创建数据框,如下所示

source.val_5 source.val_10 source.val_20 source.val_30
  A            B             C             D            

我做到了

tempList <- list()
for(i in 1:lengths(source)){

  tempList[[i]] <- data.frame(variable = paste0('source.val_',source[[1]][[i]]),  
                                value = source.val[[1]][[i]])  
}
  
temp.dat <- do.call('rbind', tempList)        
temp.dat_wider <- tidyr::pivot_wider(finalList, id_cols = value, names_from = variable)   
  

现在我想在更大的列表中执行此操作

source <- list(c(5,10,20,30),
               c(5,10,20,30),
               c(5,10,20,30),
               c(5,10,20,30))
source.val <- list(c('A', 'B', 'C', 'D'),
                   c('B', 'B', 'D', 'D'),
                   c('C', 'B', 'A', 'D'),
                   c('D', 'B', 'B', 'D'))

生成的 table 将有 4 行,如下所示:

  A tibble: 1 x 4
  source.val_5 source.val_10 source.val_20 source.val_30
    A            B             C             D      
    B            B             D             D
    C            B             A             D
    D            B             B             D
    

使用像 mapply 这样的函数来实现我想要的结果的最佳方法是什么?

对于共享的示例,其中 source 的所有元素都具有相同的顺序,您可以这样做:

cols <- paste0('source.val_', sort(unique(unlist(source))))
setNames(do.call(rbind.data.frame, source.val), cols)

#  source.val_5 source.val_10 source.val_20 source.val_30
#1            A             B             C             D
#2            B             B             D             D
#3            C             B             A             D
#4            D             B             B             D

但是,对于 source 中的每个值不遵循相同顺序的一般情况,您可以根据 source 重新排序 source.val :

source.val <- Map(function(x, y) y[order(x)], source, source.val)

然后使用上面的代码。