将应用函数应用于数据框中的行子集 - 矢量化解决方案

Use an apply function to a subset of rows in a data frame - vectorised solution

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

这里有一些代码,希望能使这个问题更清楚。

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

简单写:

with(df.data, vct.days*vct.salary)
with( df.data, fnATimesB(days,sal))

将给出一个向量

假设调用的函数是向量化的所有其他解决方案,如果不是这样的话,这里是另一个解决方案:

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