>>> [(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])
}
答案 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}},Reduce
和Filter
)。
特定问题的早期答案,自删除后,仅为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