在R中重写这个列表理解

时间:2012-01-05 16:27:15

标签: python r list-comprehension

>>> [(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 个答案:

答案 0 :(得分:15)

对于一般模式,也许

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))

(我比Steve Map更喜欢mapply,因为它默认情况下不会简化,输入更短,并且与其手册页中记录的其他功能函数配合使用,例如{{1} 1}},ReduceFilter)。

特定问题的早期答案,自删除后,仅为Negate,效率会更高。

答案 1 :(得分:6)

Josh的答案很明显,但是如果你想要在Python上下文中对zip为你做的事情进行一些概括,那么看一下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

更新:请参阅Martin的回答:如果您认为自己想要mapply,他会提出一个很好的观点,您可能真的希望使用Map的便利性。

答案 2 :(得分:1)

我的问题不明确。 lapply遍历列表的元素。因此,您的匿名函数将应用于a的每一列,但您的示例似乎表明您要将二进制函数应用于两列。

我猜你想要的东西是:

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