在Dataframe中的所有元素上应用函数

时间:2013-06-05 01:30:53

标签: r function

我确信答案很简单,但我在最后几天做了很多搜索,但显然无法找到正确的事情。问题是:我通过RODBC导入了一个数据集,显示了什么每个用户产生多少利润

userdata <- sqlQuery(channel, query) 
userdata    

  USER   P1  P2   P2   P3
1 322    459 354  349  699 
2 232    249 311  349  699 
3 433    390 393  349  699 

然后我创建了4个具有各自条件的函数,它们只返回一个数字,客户生命周期值。我喜欢在每个列P1,P2,P2,P4上使用这些功能。例如,对列P1中的每个元素应用clvP1(),依此类推。最终结果开始更新'userdata'中的值,因此我可以将其发送回数据库。

所以如果有人有小费,请告诉我。

谢谢,

2 个答案:

答案 0 :(得分:2)

仅在数据框的clvP1列上应用函数P1

 userdata$P1 = clvP1(userdata[,'P1'])

完整的解决方案:

 new_userdata = with(userdata, data.frame(USER=USER, P1=clvP1(P1), P2=clvP2(P2),
                                          P3=clvP3(P3), P4=clvP4(P4)))

答案 1 :(得分:1)

以下是如何将特定功能应用于特定列的实用示例:

示例数据:

test <- data.frame(a=1:3,b=4:6)
test

  a b
1 1 4
2 2 5
3 3 6

将函数定义为columnname+"fun"

afun <- function(x) {exp(x)}
bfun <- function(x) {log(x)}

afun应用于col a,将bfun应用于col b,依此类推......

data.frame(
  mapply(
    function(x,y) do.call(y,list(x)),
    test, 
    paste(names(test),"fun",sep=""),
    SIMPLIFY=FALSE
        )
)

结果

#     exp(a)   log(b)    as defined by afun and bfun
          a        b
1  2.718282 1.386294
2  7.389056 1.609438
3 20.085537 1.791759