应用于矢量列表

时间:2013-12-05 15:31:03

标签: r list apply

我有R中的数值向量列表(每个都有不同的大小)。假设列表中有10个元素。

我想将一个函数(类似max(x - K, 0),其中K是一个固定的常量)应用于列表的每个向量的每个元素,并获得具有完全相同结构的输出(因此矢量列表。)

我尝试了sapply(data, function(x) max(x-K, 0))但是我得到了一个大小为10的向量。顺便说一句,我不确切知道它的组成部分是什么。我也直接尝试了max(data-K,0),但收到了错误消息。

任何人都可以帮助我吗?

4 个答案:

答案 0 :(得分:4)

## 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
....

但是,您不希望最大值或并行最大值,即对于每个列表元素,{{1}的每个元素的向量重新调整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在某处找到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 。让你的匿名函数接受参数K并传递你希望在调用函数时使用的K值更好。这就是我在上面的例子中所做的,例如

K

其中我用lapply(ll, function(x, K) pmax(x - K, 0), K = 0.3) |___________ FUN ___________| |_ ARGS_| 标记的位是您提供给参数ARGS的函数所需的任何其他参数的地方。

答案 1 :(得分:1)

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才能进行成对比较。

答案 2 :(得分:1)

由于您要返回列表,因此应使用lapply代替sapply。此外,函数max占用了向量x的最大值。请改用pmax

lapply(data,function(x) pmax(x-K,0))

答案 3 :(得分:0)

如果您想获取列表,则应将sapply替换为lapply

lapply(data,function(x) max(x-K,0))