我正在尝试创建一个可以应用于数据框中每一行的单个列的函数。
我想要的功能是将总销售额输入到数据框中,搜索它所属的范围(在1000个值的数据库中 - 它有一列minsales,maxsales和佣金) ,然后退还佣金。
我已经创建了一个工作函数来执行此操作,但是,当我尝试将其应用于数据框的整个列时,它不会在每个单独的行上工作 - 它只是从中复制找到的值第一行到后续行。我总是得到警告"较长的对象长度不是较短对象长度的倍数",我假设这是尝试获取列值并尝试将其与约~1000的数据库进行比较的结果值。我知道它只是一个警告,但我猜它是我的代码故障的原因。
到目前为止,我已经尝试使用apply
和lapply
作为我的功能,因为该网站上的其他答案已经建议,但我最终得到了"未使用的参数(X [[I]])" (即使我正确地定义了我的其他所需参数),即便如此,我仍然得到"较长的对象长度不是较短对象长度的倍数"另外。
换句话说,我想要一个产生它的表(值只是示例):
Sales CommIndexnum(Function applied to entire col) Commission
210000 1 25771
210250 2 25901
211000 3 26031
但是目前我最终得到了这个和对象长度警告(值只是示例):
Sales CommIndexnum(Function applied to entire col) Commission
25000 1 25771
30000 1 25771(wrong return value)
35000 1 25771(wrong return value)
根问题似乎是查找功能,所以我省略了值返回功能。这是我的主要代码:
# database call
Database <- read.csv("database.csv")
# lookup function that returns index number of commission
commissionindexnum <- function(totalsales, minv, maxv) {
which(totalsales >= minv & totalsales <= maxv)
}
# test data frame
Employee <-
data.frame(
Name = character(3),
#sales amount used for lookup
TotalSales = c(212000, 209000, 211000),
#index number for the value to be used for commission
CommissionIndexnum = double(3),
#empty vector- lookup return values should go into the commission section
Commission = double(3)
)
# errors appear here (database has ~1000 values- total sales amount would be searched for in it)
Employee[,3] <- commissionindexnum(Employee[,2], Database$Min, Database$Max),
部分数据库(作为csv):
Min,Max,Commission
209740,210239,25771
210240,210739,25901
210740,211239,26031
211240,211739,26161
211740,212239,26291
212240,212739,26421
答案 0 :(得分:0)
感谢alistaire的评论,找到答案。更改原始查找功能以使用findInterval
可修复所有问题。使用min列工作(不是max-返回高于实际答案的值)。
commissionamt <- function(column, totalsales, minv) {
column [findInterval(totalsales, minv)]
}
#database name kept for example consistency
Employee[, 4] <-commissionamt(Database$Commission, Employee[, 2], Database$Min)