我想遍历应用于数据帧的多列的筛选器组合列表,如下所示:

df <- data.frame(    
    ID1 = c("Asset1", "Asset2", "Asset1", "Asset2", "Asset1", "Asset2", "Asset1", "Asset2"),
    ID2 = c("Asset1", "Asset1", "Asset2", "Asset2", "Asset1", "Asset1", "Asset2", "Asset2"),
    var1= c(0.011,      0.012,   0.012,    0.022,   .0011,      0.0012,   0.0012,    0.0022)
)

举个例子:

我想为以下组合计算var1的值:

filter1: ID1=='Asset1' 和 ID2=='Asset1'

filter2: ID1=='Asset1' 和 ID2=='Asset2'

对于一个组合,我显然可以这样做,用一个dspur过滤器:

library(dplyr)
df %>% filter(ID1=='Asset1', ID2=='Asset1')

但我想用一个遍历所有过滤器的for循环来完成这项工作:

filter_list <- c(filter1, filter2)

for (filter_i in filter_list){
    df %>% filter(filter_i)
}

推荐答案

您可以从列1:2中的unique个assets资源 创建筛选器列表.接下来,使用expand.grid的所有2-排列生成filter_list.

> assets <- unique(unlist(df[1:2]))
> filter_list <- expand.grid(assets, assets) |> asplit(1) 

最后,你可以lapply,subset以上的名单.

> lapply(filter_list, \(x) subset(x=df, ID1 == x[1] & ID2 == x[2]))
[[1]]
     ID1    ID2   var1
1 Asset1 Asset1 0.0110
5 Asset1 Asset1 0.0011

[[2]]
     ID1    ID2   var1
2 Asset2 Asset1 0.0120
6 Asset2 Asset1 0.0012

[[3]]
     ID1    ID2   var1
3 Asset1 Asset2 0.0120
7 Asset1 Asset2 0.0012

[[4]]
     ID1    ID2   var1
4 Asset2 Asset2 0.0220
8 Asset2 Asset2 0.0022

或者,如果你坚持for

> res <- vector('list', length(filter_list))  ## initialize
> for (i in seq_along(filter_list)) {
+   res[[i]] <- subset(x=df, ID1 == filter_list[[i]][1] & ID2 == filter_list[[i]][2])
+ }
> res
[[1]]
     ID1    ID2   var1
1 Asset1 Asset1 0.0110
5 Asset1 Asset1 0.0011

[[2]]
     ID1    ID2   var1
2 Asset2 Asset1 0.0120
6 Asset2 Asset1 0.0012

[[3]]
     ID1    ID2   var1
3 Asset1 Asset2 0.0120
7 Asset1 Asset2 0.0012

[[4]]
     ID1    ID2   var1
4 Asset2 Asset2 0.0220
8 Asset2 Asset2 0.0022

Data:

> dput(df)
structure(list(ID1 = c("Asset1", "Asset2", "Asset1", "Asset2", 
"Asset1", "Asset2", "Asset1", "Asset2"), ID2 = c("Asset1", "Asset1", 
"Asset2", "Asset2", "Asset1", "Asset1", "Asset2", "Asset2"), 
    var1 = c(0.011, 0.012, 0.012, 0.022, 0.0011, 0.0012, 0.0012, 
    0.0022)), class = "data.frame", row.names = c(NA, -8L))

R相关问答推荐

在位置周围设定一个半径并识别该半径内的其他位置

R Markdown中的交叉引用表

基于不同组的列的相关性

如何按排序顺序打印一个框架中所有精确的唯一值?

在不安装软件包的情况下测试更新

修改用R编写的用户定义函数

计算具有奇数日期的运行金额

如何直接从R中的风险分数计算c指数?

多个模拟序列间的一种预测回归关系

如何同时从多个列表中获取名字?

R Select()可以测试不存在的子集列

将Posict转换为数字时的负时间(以秒为单位)

以字符格式导入的ExcelElectron 表格日期列标题

识别连接的子网(R-igraph)

使用gt_summary是否有一种方法来限制每个变量集进行配对比较?

`-`是否也用于数据帧,有时使用引用调用?

希望解析和复制R中特定模式的数据

具有由向量定义的可变步长的序列

动态统计函数在ShinyApp内部更改

如何将两个用不同的运算符替换*的矩阵相乘