我刚刚在帖子中被介绍到“元素匹配”如何从函数内部用字符串命名子列表? https://stackoverflow.com/questions/76445543/how-to-name-sublists-with-character-strings-from-inside-a-function这似乎比我通常使用 for 循环读取列表/数据帧的方法要好得多apply()
功能。有没有办法替代两者lapply()
下面示例代码中的函数具有元素匹配([x %in% y]
)?我正在摆弄它,但还没有让它发挥作用。下面代码中我的“元素匹配”的单个示例突出显示为# ELEMENT MATCHING
.
My createBucket()
函数将三个列表拼凑在一起,但在lapply()
部分代码为在中找到的所有元素创建子列表dfList
$Elements 名称下的列表(并且也表示在seriesVector()
函数)并为每个数据帧/矩阵创建小的 3 列数据帧/矩阵,行数由输入参数设置nbr_rows
。它工作得很好,但我想知道是否有更好或更有效的方法来做到这一点,特别是使用“元素匹配”。
这篇文章底部的图像显示了运行的(正确且期望的)输出createBucket()
功能。
Code:
balVector <- c(1000,1000,1000)
flowVector <- c(6,5,4)
seriesVector <- function() {c("DF_One", "DF_Two")}
dfList <-
list(
Elements =
list(
DF_One = c("Boy", "Cat"),
DF_Two = c("Rat", "Bat")
),
Shares =
list(
DF_One = c(0.6,0.6,0.6,0.6,0.6),
DF_Two = c(0.4,0.4,0.4,0.4,0.4)
),
Rate =
list(
DF_One = 0.10,
DF_Two = 0.20
)
)
createBucket <- function(nbr_rows) {
total <- list(
Total = list(balVector = balVector,flowVector = flowVector)
)
series <- seriesVector()
allocate <- list(Allocate = dfList$Shares[names(dfList$Shares) %in% series]) # ELEMENT MATCHING
merged_list <- c(total, allocate, lapply(series, function(series_name) {
setNames(
lapply(dfList$Elements[[series_name]], function(element) {
df <- as.data.frame(matrix(0, nbr_rows, 3))
colnames(df) <- c('Inflow', 'Due', 'Outflow')
df
}),
dfList$Elements[[series_name]]
)
}))
names(merged_list) <- c(names(total), names(allocate), series)
return(merged_list)
}
createBucket(3)