【发布时间】:2019-11-30 17:25:48
【问题描述】:
我想更好地在 R 中编写优雅的代码,并试图避免编写嵌套循环,但无法找到 (l)apply 解决我的问题的方法。
我有一组配对文件,每个文件都有两个与之关联的变量 - 一个名称和一个数字。文件名很长,所以我想生成一个文件名向量,然后可以由我自己的自定义下游函数访问,以将它们读入数据框、绘图等。
例如,文件如下所示:
5_simulationA.k 5_simulationA.b
10_simulationA.k 10_simulationA.b
5_simulationB.k 5_simulationB.b
10_simulationB.k 10_simualtionB.b
“.k”和“.b”文件是一对配对文件,必须放在一起以进行下游处理。
我可以通过编写一个看起来像这样的嵌套循环来读取这些文件,
K_files = c()
B_files = c()
for (i in c(A,B,C)){ # iterate over letter variable
for (n in c(5,10,15)){ #iterate over numbers of the files
k_filename = paste(n, "_simulation", i, ".k")
b_filename = paste(n, "_simulation", i, ".b")
K_files = c(K_files, k_filename)
B_files = c(B_files, b_filename)
}
}
这当然是非常丑陋和不像 R 的。我很想找到一种方法来使用非常强大的 apply 或 lapply 语句,或者任何人可能拥有的任何其他优雅的解决方案。谢谢!
【问题讨论】:
-
您要查找的函数是
mapply()或map2来自purrr包(purrr只是让 apply 系列更加一致)。 -
请注意
c(A,B,C)应该是c("A", "B", "C")。 -
Map(function(a,b) { a*b }, 1:3, 4:6)(Map是mapply的特例)等价于lapply(list(c(1,4), c(2,5), c(3,6)), function(z) { z[1]*z[2] })。Map的一个优点是它需要 1 个或更多 个参数,因此可以根据需要轻松扩展到 许多 个参数。 (在这种情况下,我个人发现它比lapply等价物更容易阅读和排除故障。如果您好奇,总是使用Map代替lapply是很可行的。我不知道是否性能明显不同...) -
mapply() 解决了这个问题!很容易实现,谢谢! :)
-
简单的测试表明
lapply更快,但对该争论的判断应考虑可读性、可维护性和数据结构。