繁体   English   中英

应用于向量列表

[英]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 - K0 ,取大者,为每个元素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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM