与列表的所有向量成对比较
pairwise comparison with all vectors of a list
例如,我有一个包含 5 个向量的列表,我想比较它们中的每一个。例子
L = list(c(1:5), c(-1:-5), c(3:7), c(-4:-8), c(5:9))
[[1]]
[1] 1 2 3 4 5
[[2]]
[1] -1 -2 -3 -4 -5
[[3]]
[1] 3 4 5 6 7
[[4]]
[1] -4 -5 -6 -7 -8
[[5]]
[1] 5 6 7 8 9
我还有一个函数可以在列表的 5 个元素之间进行成对比较:
foo = function(x, y) t(x) %*% abs(y)
我想应用 foo
对我的列表进行成对比较。例如:
成对比较(foo 的 'x' 和 'y'):
[[1]]and [[2]]
[[1]]and [[3]]
[[1]]and [[4]]
[[1]]and [[5]]
[[2]]and [[3]]
[[2]]and [[4]]
[[2]]and [[5]]
[[3]]and [[4]]
[[3]]and [[5]]
[[4]]and [[5]]
...
My original file has 1000 elements
我尝试使用:
lapply(L, foo)
但我有以下消息错误:
```缺少参数“y”,没有默认值````
如何将 foo 应用到我的列表中?
可能是 combn
、apply
和 lapply
的组合?
L = list(c(1:5), c(-1:-5), c(3:7), c(-4:-8), c(5:9))
foo = function(x, y) t(x) %*% abs(y)
setNames(lapply(apply(combn(seq_along(L), 2), 2, function(x) L[x]),
function(z) foo(z[[1]], z[[2]])),
apply(combn(seq_along(L), 2), 2, paste, collapse = "-"))
#> $`1-2`
#> [,1]
#> [1,] 55
#>
#> $`1-3`
#> [,1]
#> [1,] 85
#>
#> $`1-4`
#> [,1]
#> [1,] 100
#>
#> $`1-5`
#> [,1]
#> [1,] 115
#>
#> $`2-3`
#> [,1]
#> [1,] -85
#>
#> $`2-4`
#> [,1]
#> [1,] -100
#>
#> $`2-5`
#> [,1]
#> [1,] -115
#>
#> $`3-4`
#> [,1]
#> [1,] 160
#>
#> $`3-5`
#> [,1]
#> [1,] 185
#>
#> $`4-5`
#> [,1]
#> [1,] -220
由 reprex package (v2.0.0)
于 2021-10-25 创建
outer
呢?
> outer(L, L, Vectorize(foo))
[,1] [,2] [,3] [,4] [,5]
[1,] 55 55 85 100 115
[2,] -55 -55 -85 -100 -115
[3,] 85 85 135 160 185
[4,] -100 -100 -160 -190 -220
[5,] 115 115 185 220 255
例如,我有一个包含 5 个向量的列表,我想比较它们中的每一个。例子
L = list(c(1:5), c(-1:-5), c(3:7), c(-4:-8), c(5:9))
[[1]]
[1] 1 2 3 4 5
[[2]]
[1] -1 -2 -3 -4 -5
[[3]]
[1] 3 4 5 6 7
[[4]]
[1] -4 -5 -6 -7 -8
[[5]]
[1] 5 6 7 8 9
我还有一个函数可以在列表的 5 个元素之间进行成对比较:
foo = function(x, y) t(x) %*% abs(y)
我想应用 foo
对我的列表进行成对比较。例如:
成对比较(foo 的 'x' 和 'y'):
[[1]]and [[2]]
[[1]]and [[3]]
[[1]]and [[4]]
[[1]]and [[5]]
[[2]]and [[3]]
[[2]]and [[4]]
[[2]]and [[5]]
[[3]]and [[4]]
[[3]]and [[5]]
[[4]]and [[5]]
...
My original file has 1000 elements
我尝试使用: lapply(L, foo) 但我有以下消息错误: ```缺少参数“y”,没有默认值````
如何将 foo 应用到我的列表中?
可能是 combn
、apply
和 lapply
的组合?
L = list(c(1:5), c(-1:-5), c(3:7), c(-4:-8), c(5:9))
foo = function(x, y) t(x) %*% abs(y)
setNames(lapply(apply(combn(seq_along(L), 2), 2, function(x) L[x]),
function(z) foo(z[[1]], z[[2]])),
apply(combn(seq_along(L), 2), 2, paste, collapse = "-"))
#> $`1-2`
#> [,1]
#> [1,] 55
#>
#> $`1-3`
#> [,1]
#> [1,] 85
#>
#> $`1-4`
#> [,1]
#> [1,] 100
#>
#> $`1-5`
#> [,1]
#> [1,] 115
#>
#> $`2-3`
#> [,1]
#> [1,] -85
#>
#> $`2-4`
#> [,1]
#> [1,] -100
#>
#> $`2-5`
#> [,1]
#> [1,] -115
#>
#> $`3-4`
#> [,1]
#> [1,] 160
#>
#> $`3-5`
#> [,1]
#> [1,] 185
#>
#> $`4-5`
#> [,1]
#> [1,] -220
由 reprex package (v2.0.0)
于 2021-10-25 创建outer
呢?
> outer(L, L, Vectorize(foo))
[,1] [,2] [,3] [,4] [,5]
[1,] 55 55 85 100 115
[2,] -55 -55 -85 -100 -115
[3,] 85 85 135 160 185
[4,] -100 -100 -160 -190 -220
[5,] 115 115 185 220 255