2014-10-06 5 views
0

Далее следует упрощенная версия моей проблемы, которая намного проще объяснить, чем моя оригинальная. Предположим, у меня есть вектор параметровSapply on User Defined Function

par<-c(0.2,0.5,0.7,0.3,0.9,1,1.2,1.8,1.5)

и список под названием total определяется как

total 
[[1]] 
[1] 0.2 0.6 0.8 0.3 0.9 

[[2]] 
[1] 0.2 0.6 0.8 0.3 0.9 0.2 0.8 0.3 0.9 0.2 0.6 0.3 0.9 

[[3]] 
[1] 0.2 0.6 0.8 0.3 0.9 0.2 0.8 0.3 0.9 0.2 0.6 0.3 0.9 

Теперь, позволяет сказать, что я хотел бы применить функцию mean каждому из 3-х элементов списка и каждый раз умножать результат на функцию из двух параметров, выбранных из par. Однако параметры, которые нужно выбрать, изменяются с каждой итерацией sapply. Например, когда я вычисляю среднее значение для первого элемента списка, я хочу умножить время результата sqrt(par[2]*par[3]), тогда как при вычислении среднего значения второго элемента в list я хочу умножить время результата sqrt(par[5]*par[6]) и т. Д.

Я знаю, что могу использовать sapply, чтобы получить среднее значение каждого элемента в total делая

sapply(total, mean)

но как я могу сказать sapply сделать rolling умножение результата? Должен ли я использовать rapply?

+0

Вы не нужно это неудобно lapply/unlist call. Просто 'sapply (total, mean)'. И это не совсем «катящееся» приложение. Вероятно, вы должны преобразовать свой объект 'par' в список и использовать' mapply'. –

+0

Хорошо, позвольте мне исправить это! –

+0

Каково правило прохождения вашего векторного вектора? – agstudy

ответ

2

С помощью утилизации вы можете фильтровать свой векторный вектор, чтобы пропустить один элемент, а затем выбрать следующие два.

par <- c(0.2,0.5,0.7,0.3,0.9,1,1.2,1.8,1.5) 
xx <- par[c(FALSE,TRUE,TRUE)] 

Тогда tapply разделить вектор хх каждой пары и вычислить SQRT:

sqrt_xx <- 
tapply(xx,rep(1:(length(xx)/2),each=2),function(x)sqrt(prod(x)))) 

Затем с помощью mapply:

mapply(function(x,y)mean(x)*y, ,total,sqrt_xx) 
0.3313005 0.5108295 0.8847826 

Где Всего:

dput(total) 
list(c(0.2, 0.6, 0.8, 0.3, 0.9), c(0.2, 0.6, 0.8, 0.3, 0.9, 0.2, 
0.8, 0.3, 0.9, 0.2, 0.6, 0.3, 0.9), c(0.2, 0.6, 0.8, 0.3, 0.9, 
0.2, 0.8, 0.3, 0.9, 0.2, 0.6, 0.3, 0.9)) 
+0

Отлично, это именно то, что мне нужно! –

 Смежные вопросы

  • Нет связанных вопросов^_^