我有一份清单:
lst
lst <- list(a=c(2.5,9.8,5.0,6.7,6.5,5.2,34.4, 4.2,39.5, 1.3,0.0,0.0,4.1,0.0,0.0,25.5,196.5, 0.0,104.2,0.0,0.0,0.0,0.0,0.0),b=c(147.4,122.9,110.2,142.3))我想为一个列表的每个值和一个列表的每个元素(a和b)计算一个z.score为:(x[i]-mean(x)/sd(x),其中x是列表中每个元素的所有值(togheter),而xi是每个list元素的每个单独的组件。我和lapply试过
lapply(lst,function (x) as.data.frame(apply(x,2, function(y)- lapply(lst,mean)/lapply(lst,sd))))但有个错误..。可以使用for循环,如:
lst.new <- vector("list",1)
for (i in 1:length(lst)){
for (j in 1:dim(data.frame(lst[i]))[1]){
res[j] <- (as.numeric(unlist(lst[i]))[j]-mean(as.numeric(unlist(lst[i])))/
sd(as.numeric(unlist(lst[i])))
lst.new[[i]] <- res
}
}但是结果是奇怪的(当然,我在lst.new输出中错了):
[[1]]
[1] -0.3635464 -0.1982809 -0.3069486 -0.2684621 -0.2729899 -0.3024208 0.3586413 -0.3250599 0.4741007 -0.3907133
[11] -0.4201442 -0.4201442 -0.3273238 -0.4201442 -0.4201442 0.1571532 4.0284412 -0.4201442 1.9388512 -0.4201442
[21] -0.4201442 -0.4201442 -0.4201442 -0.4201442
[[2]]
[1] 0.9671130 -0.4517055 -1.1871746 0.6717671 -0.2729899 -0.3024208 0.3586413 -0.3250599 0.4741007 -0.3907133
[11] -0.4201442 -0.4201442 -0.3273238 -0.4201442 -0.4201442 0.1571532 4.0284412 -0.4201442 1.9388512 -0.4201442
[21] -0.4201442 -0.4201442 -0.4201442 -0.4201442预期结果可以是不同长度的列表或数据帧,如下所示:
a b
-0.36 0.967113
-0.19 -0.45
[...] [...]等等..。
P.S:
0.36 == (2.5- mean(unlist(lst[1])))/sd(unlist(lst[1]))
0.967113 == (147.4 -mean(unlist(lst[2])))/sd(unlist(lst[2]))我最好用lapply (或者他的家庭功能)来解决这个问题
发布于 2018-12-03 16:35:37
为了完整起见,如果没有scale函数@akrun,您的代码应该是:
lapply(lst,function(x) x-mean(x)/sd(x)) 所有这些lapply在apply中意味着您正在试图计算单个值的mean和sd .
让我们一步一步地完成它。lapply获取lst并将其分解为元素。每个元素依次作为匿名函数的参数。这意味着函数得到一个数字向量。然后,利用R的矢量化,我们计算向量的每个元素的结果,减去整个向量的mean除以整个向量的sd。
将其与代码中发生的情况进行比较:
lapply(lst,function (x) as.data.frame(apply(x,2, function(y)- lapply(lst,mean)/lapply(lst,sd))))因此,第一个lapply中断了1,并将向量一次一个地发送到您的函数。
然后,函数必须将向量分解为列(带有维度参数2的apply)--这是它抛出错误的地方。但是,即使它成功地将向量分解成元素,那么还有另外两个lapply,它分解了单个元素,并分别计算了它们的mean和sd。
发布于 2018-12-03 16:28:45
根据输入和预期输出,scale应该工作
lapply(lst, scale)https://stackoverflow.com/questions/53597621
复制相似问题