2017-07-29 69 views
0

我想创建一个函数,可以应用于数据框中的单个列,每行。更大的数据帧中的数据帧列查找

我想要的功能是将总销售价值输入到数据框中,搜索它所处的范围(在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 
+0

我有点困惑,很难确切知道如果没有可重复的例子,该怎么做。你能否添加至少一部分数据库数据框? –

+0

是的,给我们一个可重复的例子,你可能想检查你的标签,因为它不关于闪亮。我想你可能想查找'?地图' –

+0

更新 - 我查了地图。如果我正确地理解它 - 它可以采用列表/列,并且如果使用函数将返回相同的值。 – Shan

回答

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)