大数据框中的数据框列查找

时间:2017-07-29 18:34:52

标签: r

我正在尝试创建一个可以应用于数据框中每一行的单个列的函数。

我想要的功能是将总销售额输入到数据框中,搜索它所属的范围(在1000个值的数据库中 - 它有一列minsales,maxsales和佣金) ,然后退还佣金。

我已经创建了一个工作函数来执行此操作,但是,当我尝试将其应用于数据框的整个列时,它不会在每个单独的行上工作 - 它只是从中复制找到的值第一行到后续行。我总是得到警告"较长的对象长度不是较短对象长度的倍数",我假设这是尝试获取列值并尝试将其与约~1000的数据库进行比较的结果值。我知道它只是一个警告,但我猜它是我的代码故障的原因。

到目前为止,我已经尝试使用applylapply作为我的功能,因为该网站上的其他答案已经建议,但我最终得到了"未使用的参数(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

1 个答案:

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