将apply函数用于数据框中的行子集 - 矢量化解

时间:2015-07-21 08:08:34

标签: r dataframe sapply

我正在尝试实现一个矢量化解决方案,该解决方案在每次迭代期间迭代数据帧的每一行,发送一个函数两个参数。这些参数对应于数据框中的列。

这是一些希望使这个问题更清晰的代码。

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

3 个答案:

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

会给出一个向量