【问题标题】:R: How to use apply function in below code instead of loopR:如何在下面的代码中使用应用函数而不是循环
【发布时间】:2016-06-21 09:25:25
【问题描述】:

我需要在我的代码中使用任何应用函数而不是 for 循环。下面提到的是示例代码和函数。

这是我的数据

  testdata<-data.table(x1=sample(1000),y1=sample(1000),x2=sample(1000),y2=sample(1000),h=sample(1000))

这是我的功能

testfunction<-function(x0,y0,x1,y1,x2,y2,h){
  x<-x0+x1+x2+y0+y1+y2
  y<-x+x0+y0
  d<-x+y
  R<-x+y+d
  result <- data.frame(d,R,x,y)
  return (result)
}

我当前的 for 循环代码是

resultdf<-data.frame(d=NA,R=NA,x=NA,y=NA)
for (i in 1:nrow(reqdata.LN)){
    resultdf[i,]<-testfunction(x0=1.2,y0=2.1,testdata$x1[i],testdata$x2[i],
                               testdata$y1[i],testdata$y2[i],testdata$h[i])
} 

我尝试过使用 lapply 和 sapply,但错误很少

bb<-lapply(1:nrow(testdata),testfunction,x0=1.2,y0=2.1,testdata$x1[i],testdata$x2[i],
           testdata$y1[i],testdata$y2[i],testdata$h[i]) 

有人可以告诉如何使用这个应用功能。

【问题讨论】:

    标签: r apply


    【解决方案1】:

    因为我们有一个data.table,所以函数可以直接应用,因为+是矢量化的。

    res <- testdata[, testfunction(x0=1.2, y0=2.1, x1, y1, x2, y2, h)]
    head(res)
    #      d      R      x      y
    #1 3923.9 7847.8 1960.3 1963.6
    #2 2689.9 5379.8 1343.3 1346.6
    #3 4523.9 9047.8 2260.3 2263.6
    #4 3535.9 7071.8 1766.3 1769.6
    #5 3183.9 6367.8 1590.3 1593.6
    #6 3677.9 7355.8 1837.3 1840.6
    

    注意:OP 帖子中的函数返回data.frame。当我们使用data.table时,最好将其返回为list,这样它就会成为一个data.table对象

    testfunction<-function(x0,y0,x1,y1,x2,y2,h){
       x<-x0+x1+x2+y0+y1+y2
       y<-x+x0+y0
       d<-x+y
       R<-x+y+d
       list(d= d,R=R,x= x,y = y)
    
     } 
    
    head(testdata[, testfunction(x0=1.2, y0=2.1, x1, y1, x2, y2, h)])
    #      d      R      x      y
    #1: 3923.9 7847.8 1960.3 1963.6
    #2: 2689.9 5379.8 1343.3 1346.6
    #3: 4523.9 9047.8 2260.3 2263.6
    #4: 3535.9 7071.8 1766.3 1769.6
    #5: 3183.9 6367.8 1590.3 1593.6
    #6: 3677.9 7355.8 1837.3 1840.6
    

    【讨论】:

    • 谢谢阿克伦。实际上,上面的函数是示例,它与 for 循环和 data.table 代码显示相同的结果。但是对于我的实际功能,它与 for 循环和您的数据表代码给出了不同的结果。你有什么想法吗?
    • @PPC 您使用+ 创建的函数是矢量化的。您的实际功能可能并非如此。您可能需要创建一个具有模仿原始问题的功能的新帖子。
    • 是的,我的实际功能并没有这么简单而且有点复杂。数据是保密的,所以我不能分享它。有没有办法通过应用函数将行的每个元素传递给函数。
    • @PPC 不知道功能很难评论。我猜基本 R applyMARGIN =1 应该可以工作。
    • @PPC 不知道功能很难评论。我猜基本 R applyMARGIN =1 应该可以工作。
    猜你喜欢
    • 1970-01-01
    • 2020-11-20
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多