将函数应用于多个列表 (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)
然后使用上面的代码。
我有两个列表:
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)
然后使用上面的代码。