2016-04-13 2 views
1

Если у меня есть списокВозьмите два значения в качестве входных данных в списке R

sample <- list(a = c(1:5), b = c(11:15)) 

Я хотел бы написать функцию вроде следующего

res <- lapply(sample, function(x) { sample$a + sample$b * 5}) 

и результат будет просто

[1] 56 62 68 74 80 

Я знаю, что это может быть достигнуто простым sample$a + sample$b*5, но у меня есть сложные вычисления, которые не попадают в него.

+3

Я не совсем уверен, что вы пытаясь выполнить здесь. Вы даете только функцию, в которой вы сами признаете, что ее можно переписать проще, но имеют более сложные вычисления, которые не попадают в это. Так каким образом они не попадают в это? Может быть, станет понятнее, если вы объясните, почему вы хотите использовать 'lapply' здесь. Edit: Кроме того, имя 'sample' сначала немного запутывалось, так как' sample' является очень часто используемой функцией в R. Вы можете переключиться на нечто вроде 'lis'. – Laterow

+0

'sample $ a + sample $ b * 5' не дает результата, о котором вы сообщали. Голосование закрывается, как непонятно, что вы просите. – nicola

+0

Извините, я несерьезна –

ответ

2

Один из альтернативных вариантов использования do.call

do.call(function(a,b) a + b*5, sample) 
[1] 56 62 68 74 80 
2

Вы можете сделать это с помощью mapply

mapply(function(x,y) x+y*5, sample$a, sample$b) 
+0

Или его дружественная оболочка 'Map()' – lmo

0

mapply() и do.call(), конечно, будет работать, если вы должны использовать списки по какой-то причине. Но, в зависимости от вашего контекста, data.frame может быть лучшей структурой данных.

Использование dplyr

library(dplyr) 
as.data.frame(sample) %>% 
    mutate(result = a + b * 5) 

Или, используя базовые функции:

d <- as.data.frame(sample) 
transform(d, result = a + b * 5) 
1

Мы могли бы преобразовать в data.table и сделать это

library(data.table) 
setDT(sample)[, a+b*5] 
#[1] 56 62 68 74 80