申请并申请列表R的每个组成部分和元素

时间:2018-12-03 16:13:37

标签: r list dataframe lapply

我有此列表:

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))

我想为列表的每个值和列表的每个元素(ab)计算一个z.score:(x[i]-mean(x)/sd(x),其中x都是列表的每个元素的值(togheter)和x [i]每个列表元素的每个单个组件。 我尝试过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(或他的家庭功能)并解决问题

2 个答案:

答案 0 :(得分:4)

根据输入和预期的输出,scale应该有效

lapply(lst, scale)

答案 1 :(得分:3)

仅出于完整性考虑,如果没有@akrun指出scale函数,您的代码应该是:

lapply(lst,function(x) x-mean(x)/sd(x)) 

lapply中的所有apply表示您正在尝试计算各个值的meansd ...

让我们逐步解决它。 lapplylst并将其分解为元素。每个元素依次作为匿名函数的参数给出。这意味着该函数获得数字向量。然后,使用R的向量化,我们为向量的每个元素计算该元素的结果,减去整个向量的mean除以整个向量的sd

将其与代码中的内容进行比较:

lapply(lst,function (x) as.data.frame(apply(x,2, function(y)- lapply(lst,mean)/lapply(lst,sd))))

因此第一个lapply中断lst并将向量一次发送到您的函数。

然后,该函数必须按向量(带有维度参数2的{apply)将向量分解,这是引发错误的地方。但是,即使成功地将向量分解为元素,您也可以再使用两个lapply来分解单个元素,并分别为它们计算meansd。< / p>