/ / Повернути кілька списків у mapply [дублікати] - r, mapply

Повернути кілька списків у mapply [дублікати] - r, mapply

У мене є функція, яку я застосовую через aсписок кадрів даних або матриць (df) з використанням mapply. Функція виводить чотири різних типи кадрів даних (наприклад, a: d) на основі деяких критеріїв перетворення вихідного фрейма даних, але у мене виникають проблеми, оскільки функція дозволить мені лише вивести її. Я намагався зіставити їх у списку, але, коли я виконую спрощену функцію, я отримую це.

df1<-matrix(rnorm(10), nrow=10, ncol=10)
df2<-df1
df<-list(df1, df2)

func<-function (x) {
a<-x*1
b<-x*2
c<-x*3
d<-x*4
return(list(a,b,c,d))
}

finalresult<-mapply(func, x=df)

str(finalresult)

List of 8
$ : num [1:10, 1:10] -3.211 -0.121 -0.2 0.491 1.118 ...
$ : num [1:10, 1:10] -6.422 -0.242 -0.4 0.982 2.235 ...
$ : num [1:10, 1:10] -9.633 -0.362 -0.6 1.473 3.353 ...
$ : num [1:10, 1:10] -12.844 -0.483 -0.8 1.964 4.471 ...
$ : num [1:10, 1:10] -3.211 -0.121 -0.2 0.491 1.118 ...
$ : num [1:10, 1:10] -6.422 -0.242 -0.4 0.982 2.235 ...
$ : num [1:10, 1:10] -9.633 -0.362 -0.6 1.473 3.353 ...
$ : num [1:10, 1:10] -12.844 -0.483 -0.8 1.964 4.471 ...
- attr(*, "dim")= int [1:2] 4 2

У цьому випадку ви можете побачити, що це просто дає менісписок чотирьох кадрів вихідних даних (a: d) з df1, а потім додає наступний набір виходів з df2 відразу після. Я хочу отримати висновок, де кожне перетворення даних кадрів буде додано до списку, де я можу отримати доступ до нього за категоріями (наприклад, finalresults $ a). Будь-яка допомога буде дуже вдячна!

Дякую, -Chelsea

Відповіді:

3 для відповіді № 1

Як на рахунок:

Використовуйте mapply але не спростіть.

result1 <- mapply(func, x=df, SIMPLIFY=FALSE)

Ітерація над індексами (це припускає, що обидва списки в результаті мають однакову довжину); для кожного індексу i, використовувати lapply витягнути iго елемента кожного списку в result1.

 result2 <- lapply(seq_along(result1[[1]]),
function(i) lapply(result1,"[[",i))

Я трохи намагався скоротити / замаскувати це ще далі (тобто видалити необхідність визначити анонімну функцію), але з вкладеністю lapplyЯ не можу розібратися, як це зробити.


1 для відповіді № 2

Ось рішення, яке дає те, що ви хочете. Він в основному іменує ваш список повертає, а потім агрегати за назвою.

df1<-matrix(rnorm(10), nrow=10, ncol=10)
df2<-df1
df<-list(df1, df2)
namesToReferTo = letters[1:4]
func<-function (x) {
a<-x*1; b<-x*2; c<-x*3; d<-x*4
retList = list(a,b,c,d)
names(retList)=namesToReferTo
return(retList)
}
finalresult = lapply(namesToReferTo, function(y) { lapply(lapply(df,func), function(x) { x[[y]] }) } )
# alternatively: finalresult = lapply(namesToReferTo, function(y) { Map(function(x) { return(x[[y]])} , lapply(df,func)) } )
names(finalresult) = namesToReferTo
str(finalresult)
finalresult$b