Перепишите этот список-понимание в R - PullRequest
4 голосов
/ 05 января 2012
>>> [(x*y) for (x,y) in zip(range(3), (1,11,111))]
[0, 11, 222]                                             

Не так

> data.frame(0:2,c(1,11,111))
  X0.2 c.1..11..111.
1    0             1
2    1            11
3    2           111
> data.frame(0:2,c(1,11,111))->a
> a[1]*a[2]
  X0.2
1    0
2   11
3  222

, но примерно так

lapply(a, function(x)
{   ...how can I access here the parameters of x? 
    (not using x[1] or x[2])
}

Ответы [ 3 ]

15 голосов
/ 05 января 2012

Для общей схемы, возможно

Map(`*`, 0:2, c(1, 11, 111))

или

unlist(Map(`*`, 0:2, c(1, 11, 111)))

или более явно

Map(function(x, y) x*y, 0:2, c(1, 11, 111))

(мне нравится Map лучше, чем mapply Стива, потому что он не упрощается по умолчанию, короче набирает текст и хорошо работает с другими функциональными функциями, описанными на его man-странице, например, Reduce, Filter и Negate).

Более ранний ответ на конкретный вопрос, так как он был удален, был просто 0:2 * c(1, 11, 111), что было бы гораздо эффективнее.

6 голосов
/ 05 января 2012

Ответ Джоша точен, но если вы хотите обобщить то, что zip делает для вас в контексте Python, взгляните на mapply, который «применяет» к нескольким «вещам» в один раз и применяет функцию к i -ому элементу из каждой «вещи», например:

x1 <- 0:2
x2 <- c(1, 11, 111)
mapply(function(x, y) x*y, x1, x2)
## [1]   0  11 222

и

x3 <- c(10, 20, 30)
mapply(function(x, y, z) x * y + z, x1, x2, x3)
## [1]  10  31 252

Обновление: см. Также ответ Мартина: он хорошо говорит о том, что если вы считаете, что вы хотите mapply, вы, возможно, действительно захотите использовать удобство Map.

1 голос
/ 05 января 2012

Ваш вопрос мне не понятен. lapply зацикливает элементы списка. Таким образом, ваша анонимная функция будет применяться к каждому столбцу a, но ваш пример показывает, что вы хотите применить двоичную функцию к двум столбцам.

Полагаю, вы хотите что-то вроде:

do.call("*",a)
# [1]   0  11 222
...