【问题标题】:Going from a for loop to a function in R从 for 循环到 R 中的函数
【发布时间】:2015-08-06 15:33:02
【问题描述】:

我很好奇如何将我编写的 for 循环转换为 R 中的函数?我没有在 R 中编写自己的函数的经验。我查看了 herehere 但这些似乎并没有提供太多帮助。我知道 for 循环不是必需的,总的来说,我正在尝试做类似于this blog post 的事情。

具有可重现数据的 for 循环在这里:

P <- c(1:50)
y <- length(P)
D <- as.data.frame(combs(P,2))
Z <- choose(y,2)
Num = NULL
Denom = NULL
Diff = NULL

for(n in 1:Z)
   {
    Num[n] = abs(D$V1[n]-D$V2[n])
    Denom[n] = max(D$V1[n], D$V2[n])
    Diff[n] = Num[n]/Denom[n]
    }
 PV=mean(Diff)
 PV

但是,我有兴趣根据这些数据中的级别计算 PV:

DATA <- c(1:500)
NAME <- c("a", "b", "c", "d", "e")
mydf <- as.data.frame(cbind(DATA, NAME))

因此,我想使用的最终代码是:

ANSWER <- tapply(mydf$DATA, mydf$NAME, MY.FUNCTION) 

所以,如果我可以将上面的 for 循环变成一个工作函数,我可以运行 tapply 函数来获取基于级别的 PV。

任何帮助或与我提供的建议相反的任何其他建议都将不胜感激。

谢谢!

【问题讨论】:

  • 预期结果是什么?
  • 预期的结果是使用tapply中的函数。我希望函数返回 PV

标签: r function loops apply levels


【解决方案1】:

一旦你加载了你的库:

library(caTools)

这是您可以在数据上运行的函数:

mymeandiff <- function(values){
    df <- as.data.frame(combs(values, 2))
    diff <- abs(df$V1 - df$V2)/pmax(df$V1, df$V2)
    mean(diff)
}
mymeandiff(1:50)

然后我们可以使用dplyr在每个组上运行(修正数据后):

mydf$DATA <-as.numeric(as.character(mydf$DATA))

library(dplyr)
mydf %>% group_by(NAME) %>%
         summarise(mymeandiff(DATA))

对于 apply,而不是 dplyr:

tapply(mydf$DATA, mydf$NAME, FUN = mymeandiff)

让我们计时:

microbenchmark::microbenchmark(tapply = tapply(mydf$DATA, mydf$NAME, FUN=mymeandiff),
                               dplyr = mydf %>% group_by(NAME) %>%
                                                summarise(mymeandiff(DATA)))
Unit: milliseconds
   expr      min       lq     mean   median       uq       max neval
 tapply 60.36543 61.08658 63.81995 62.61182 66.13671  80.37819   100
  dplyr 61.84766 62.53751 67.33161 63.61270 67.58688 287.78364   100

tapply 稍快

【讨论】:

  • 这两种方法都有效并提供与我的 for 循环相同的结果。但我对如何计算不同级别的 PV 很感兴趣。比如在这个数据中 DATA
  • 谢谢!正是我想要的。感谢您的帮助!
猜你喜欢
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 2020-09-25
  • 1970-01-01
  • 2021-11-09
相关资源
最近更新 更多