我正在尝试实现一个矢量化解决方案,该解决方案在每次迭代期间迭代数据帧的每一行,发送一个函数两个参数。这些参数对应于数据框中的列。
这是一些希望使这个问题更清晰的代码。
fnATimesB <- function(a, b) {
return(a * b)
}
vct.names <- c("mark", "fred", "ben")
vct.days <- c(1, 3, 5)
vct.salary <- c(1000, 4000, 5000)
df.data <- data.frame(name = vct.names, days = vct.days, sal = vct.salary)
# want to use something like the following:
sapply(df.data, fnATimesB, days , sal)
# expected result
# 1000
# 12000
# 250000
答案 0 :(得分:4)
假设所调用的函数的所有其他解决方案都是矢量化的,如果不是这样的话,这里是另一个解决方案:
sapply( 1:nrow(df.data), function(x) {
fnATimesB( df.data[x,'days'], df.data[x,'sal'] )
} )
或者,你可以在这里使用apply
并避免匿名函数调用,而是稍微修改你的原始函数。唯一要记住的是apply
将数据集转换为矩阵,因此,您不应该在输入数据中包含非数字列,这是一个示例
fnATimesB <- function(df, a, b) {
df[a] * df[b]
}
apply(df.data[-1L], 1L, fnATimesB, a = 'days', b = 'sal')
## [1] 1000 12000 25000
答案 1 :(得分:0)
简单地写:
with(df.data, vct.days*vct.salary)
答案 2 :(得分:0)
with( df.data, fnATimesB(days,sal))
会给出一个向量