применять и применять для каждого компонента и элемента списка R - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть этот список:

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 - все значения (тогетер) каждого элемента списка, а 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 голосов
/ 03 декабря 2018

Просто для полноты, если бы не указана @akrun функция scale, ваш код должен был бы:

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 прерывает lst и отправляет векторы по одному в вашу функцию.

Затем функция должна прерыватьвектор вниз по столбцам (apply с аргументом измерения 2) - именно там он выдает ошибку.Но даже если ему удалось просто разбить вектор на элементы, у вас есть еще два lapply с, которые разбивают этот единственный элемент и вычисляют mean и sd для них по отдельности.

0 голосов
/ 03 декабря 2018

На основании входных данных и ожидаемого выхода scale должно работать

lapply(lst, scale)
...