[英]Apply to list of vectors
我在R中有一个数值向量列表(每个数值大小不同)。假设该列表有10个元素。
我想对列表的每个向量的每个元素应用一个函数(类似于max(x - K, 0)
,其中K
为固定常数),并获得具有完全相同结构的输出(因此为向量列表) )。
我尝试了sapply(data, function(x) max(xK, 0))
但得到的向量大小为10。顺便说一句,我不知道它的确切组成是什么。 我也直接尝试了max(data-K,0)
,但收到一条错误消息。
谁能帮我 ?
## dummy data
set.seed(1)
ll <- as.list(data.frame(matrix(rnorm(10 * 10), ncol = 10)))
R> str(ll)
List of 10
$ X1 : num [1:10] -0.626 0.184 -0.836 1.595 0.33 ...
$ X2 : num [1:10] 1.512 0.39 -0.621 -2.215 1.125 ...
$ X3 : num [1:10] 0.919 0.7821 0.0746 -1.9894 0.6198 ...
$ X4 : num [1:10] 1.3587 -0.1028 0.3877 -0.0538 -1.3771 ...
$ X5 : num [1:10] -0.165 -0.253 0.697 0.557 -0.689 ...
$ X6 : num [1:10] 0.398 -0.612 0.341 -1.129 1.433 ...
$ X7 : num [1:10] 2.4016 -0.0392 0.6897 0.028 -0.7433 ...
$ X8 : num [1:10] 0.476 -0.71 0.611 -0.934 -1.254 ...
$ X9 : num [1:10] -0.569 -0.135 1.178 -1.524 0.594 ...
$ X10: num [1:10] -0.543 1.208 1.16 0.7 1.587 ...
这样,如果您想要原子矢量输出,那么您所拥有的是正确的。 要查看关系,请查看矢量元素的名称
R> ( out <- sapply(ll, function(x, K) max(x - K, 0), K = 0.3) )
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
1.2953 1.2118 0.6190 1.0587 0.5811 1.6804 2.1016 0.3107 0.8781 1.2868
它们与列表元素的名称顺序相同:
R> names(out)
[1] "X1" "X2" "X3" "X4" "X5" "X6" "X7" "X8" "X9" "X10"
R> names(ll)
[1] "X1" "X2" "X3" "X4" "X5" "X6" "X7" "X8" "X9" "X10"
R> all.equal(names(out), names(ll))
[1] TRUE
如果要返回看起来像原始列表的东西,请使用lapply()
代替
R> lapply(ll, function(x, K) max(x - K, 0), K = 0.3)
$X1
[1] 1.295
$X2
[1] 1.212
$X3
[1] 0.619
$X4
[1] 1.059
$X5
[1] 0.5811
....
但是,目前尚不清楚你想要的最大或并行最大,即每个列表元素的矢量重新调整x - K
或0
,取大者,为每个元素x
。 如果需要,该功能在pmax()
函数中:
R> lapply(ll, function(x, K) pmax(x - K, 0), K = 0.3)
$X1
[1] 0.00000 0.00000 0.00000 1.29528 0.02951 0.00000 0.18743 0.43832 0.27578
[10] 0.00000
$X2
[1] 1.21178 0.08984 0.00000 0.00000 0.82493 0.00000 0.00000 0.64384 0.52122
[10] 0.29390
$X3
[1] 0.6190 0.4821 0.0000 0.0000 0.3198 0.0000 0.0000 0.0000 0.0000 0.1179
$X4
[1] 1.05868 0.00000 0.08767 0.00000 0.00000 0.00000 0.00000 0.00000 0.80003
[10] 0.46318
....
或通过sapply
,将重用简化为矩阵:
R> sapply(ll, function(x, K) pmax(x - K, 0), K = 0.3)
X1 X2 X3 X4 X5 X6 X7 X8 X9
[1,] 0.00000 1.21178 0.6190 1.05868 0.00000 0.09811 2.1016 0.1755 0.00000
[2,] 0.00000 0.08984 0.4821 0.00000 0.00000 0.00000 0.0000 0.0000 0.00000
[3,] 0.00000 0.00000 0.0000 0.08767 0.39696 0.04112 0.3897 0.3107 0.87809
[4,] 1.29528 0.00000 0.0000 0.00000 0.25666 0.00000 0.0000 0.0000 0.00000
[5,] 0.02951 0.82493 0.3198 0.00000 0.00000 1.13302 0.0000 0.0000 0.29395
[6,] 0.00000 0.00000 0.0000 0.00000 0.00000 1.68040 0.0000 0.0000 0.03295
[7,] 0.18743 0.00000 0.0000 0.00000 0.06458 0.00000 0.0000 0.0000 0.76310
[8,] 0.43832 0.64384 0.0000 0.00000 0.46853 0.00000 1.1656 0.0000 0.00000
[9,] 0.27578 0.52122 0.0000 0.80003 0.00000 0.26972 0.0000 0.0000 0.07002
[10,] 0.00000 0.29390 0.1179 0.46318 0.58111 0.00000 1.8726 0.0000 0.00000
X10
[1,] 0.0000
[2,] 0.9079
[3,] 0.8604
[4,] 0.4002
[5,] 1.2868
[6,] 0.2585
[7,] 0.0000
[8,] 0.0000
[9,] 0.0000
[10,] 0.0000
最后,请注意,优良作法是将其需要运行的所有信息传递给函数。 您依靠R在某处找到K
最好让匿名函数接受参数K
并传递调用函数时希望使用的K
值。 这是我在上面的示例中所做的,例如
lapply(ll, function(x, K) pmax(x - K, 0), K = 0.3)
|___________ FUN ___________| |_ ARGS_|
我用ARGS
标记的位置是您提供参数FUN
提供的功能所需的其他任何参数的位置。
somelist <- list()
somelist[[1]] <- sample(1:100,5)
somelist[[2]] <- sample(1:100,10)
somelist[[3]] <- sample(1:100,15)
k <- 50
somelistmod <- lapply(somelist, function(x) pmax(0,x-k))
输出-
> somelist
[[1]]
[1] 58 27 80 51 57
[[2]]
[1] 72 81 57 79 2 74 100 49 46 16
[[3]]
[1] 29 24 37 45 26 25 67 61 63 62 30 69 92 89 100
> somelistmod
[[1]]
[1] 8 0 30 1 7
[[2]]
[1] 22 31 7 29 0 24 50 0 0 0
[[3]]
[1] 0 0 0 0 0 0 17 11 13 12 0 19 42 39 50
主要区别在于您需要使用lapply
而不是sapply
,并使用pmax
而不是max
来进行成对比较。
由于要返回列表,因此应使用lapply
而不是sapply
。 此外,函数max
占用向量x
的最大值。 使用pmax
代替:
lapply(data,function(x) pmax(x-K,0))
如果要获取列表, lapply
替换为sapply
:
lapply(data,function(x) max(x-K,0))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.