将应用函数应用于数据框中的行子集 - 矢量化解决方案
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
我正在尝试实现一个矢量化解决方案,该解决方案在每次迭代期间遍历数据帧的每一行,向函数发送两个参数。这些参数对应于数据框中的列。
这里有一些代码,希望能使这个问题更清楚。
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