我有R中的数值向量列表(每个都有不同的大小)。假设列表中有10个元素。
我想将一个函数(类似max(x - K, 0)
,其中K
是一个固定的常量)应用于列表的每个向量的每个元素,并获得具有完全相同结构的输出(因此矢量列表。)
我尝试了sapply(data, function(x) max(x-K, 0))
但是我得到了一个大小为10的向量。顺便说一句,我不确切知道它的组成部分是什么。我也直接尝试了max(data-K,0)
,但收到了错误消息。
任何人都可以帮助我吗?
答案 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 - 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在某处找到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))