2014-12-10 2 views
4

У меня есть два списка с несколькими элементами, я хочу использовать эти два списка и применить формулу (функцию)применить функцию множественного списка с общими элементами в г

В качестве примера, предположим, что у меня есть два список а и в с двумя элементами х и у (у меня есть 1000-х элементов, в качестве примера позволяет сказать, что мы имеем 2 элементов х и у)

listA <- list(x=matrix(rnorm(50), nrow=10), 
       y=matrix(rnorm(50), nrow=10)) 
listB <- list(x=matrix(rnorm(5), nrow=1), 
       y=matrix(rnorm(5), nrow=1)) 

для каждой строки мне нужно применить следующий fomualae для каждого строка с теми же элементами в listA и listB и сохраните ее в соответствующем списке, как показано ниже, для двух строк для списка x и y. Мне нужно перезаписать это для всех rwos и нескольких списков.

#For list X 
# for row 1 listA 
abs(listA$x[1,]-listB$x[1,])/(abs(listA$x[1,])+abs(listB$x[1,])) 

# for row 2 listB 
abs(listA$x[2,]-listB$x[1,])/(abs(listA$x[2,])+abs(listB$x[1,])) 

#For list Y 
# for row 1 
abs(listA$y[1,]-listB$y[1,])/(abs(listA$y[1,])+abs(listB$y[1,])) 

# for row 2 
abs(listA$y[2,]-listB$y[1,])/(abs(listA$y[2,])+abs(listB$y[1,])) 

Я пытался с lapply и mapply, но не увенчались успехом до сих пор, любая помощь будет принята с благодарностью.

Большое спасибо

ответ

3

Одна попытка использования Map и sweep, что я думаю, что дает желаемый результат:

Map(function(x,y) abs(sweep(x,2,y,FUN="-"))/(sweep(abs(x),2,abs(y),FUN="+")), 
    listA, 
    listB) 

Например:

listA <- list(x=matrix(1:9, nrow=3), 
       y=matrix(1:9, nrow=3)) 
listB <- list(x=matrix(1:3, nrow=1), 
       y=matrix(4:6, nrow=1)) 

Map(function(x,y) abs(sweep(x,2,y,FUN="-"))/(sweep(abs(x),2,abs(y),FUN="+")), 
    listA, 
    listB) 

#$x 
#   [,1]  [,2]  [,3] 
#[1,] 0.0000000 0.3333333 0.4000000 
#[2,] 0.3333333 0.4285714 0.4545455 
#[3,] 0.5000000 0.5000000 0.5000000 
# 
#$y 
#   [,1]  [,2]  [,3] 
#[1,] 0.6000000 0.11111111 0.07692308 
#[2,] 0.3333333 0.00000000 0.14285714 
#[3,] 0.1428571 0.09090909 0.20000000 

Спичке расчетов с длинными руками:

abs(listA$x[1,]-listB$x[1,])/(abs(listA$x[1,])+abs(listB$x[1,])) 
#[1] 0.0000000 0.3333333 0.4000000 
abs(listA$x[2,]-listB$x[1,])/(abs(listA$x[2,])+abs(listB$x[1,])) 
#[1] 0.3333333 0.4285714 0.4545455 
abs(listA$y[1,]-listB$y[1,])/(abs(listA$y[1,])+abs(listB$y[1,])) 
#[1] 0.60000000 0.11111111 0.07692308 
abs(listA$y[2,]-listB$y[1,])/(abs(listA$y[2,])+abs(listB$y[1,])) 
#[1] 0.3333333 0.0000000 0.1428571 
+0

это именно то, что я хотел, большое спасибо @thelatemail – forecaster

+0

@forecaster - никаких проблем, если ваш запрос будет вашим запросом, вы также можете выбрать отметку рядом с стрелкой вверх, чтобы люди знали, что на нее ответили. – thelatemail

+0

Спасибо, я сделал это сейчас, сайт не позволил мне сразу принять ответ. Большое спасибо за ваш быстрый ответ. – forecaster