加速R中的布尔逻辑循环

时间:2016-03-08 03:40:39

标签: r loops boolean

我对R很新,但我有兴趣学习更多和改进。

我有一个包含大约40,000多行的数据集,其中包含神经元段的长度。我想比较不同组神经元的长度趋势。该分析的第一步涉及将测量分为6个不同类别中的1个,例如'< 10''10 -15','15 -20','20 -25','25 -30'和'> ; 30' 。 我使用'dplyr'包中的'mutate'创建了这些类别作为附加列,现在我正在尝试编写一个布尔函数来确定测量适合的位置,如果它适合,则将值'1'应用于相应的列,并且如果不是,则为'0'。 这是我写的:

    for (i in 1:40019)  {
      {if (FinalData$Length[i] <=10) 
        {FinalData$`<10`[i]<-1
      } else {FinalData$`<10`[i]<-0}} #Fills '<10'
      if (FinalData$Length[i] >=10 & FinalData$Length[i]<15){
        FinalData$`10-15`[i]<-1
      } else{FinalData$`10-15`[i]<-0} #Fills'10-15'
      if (FinalData$Length[i] >=15 & FinalData$Length[i]<20){
        FinalData$`15-20`[i]<-1
      } else{FinalData$`15-20`[i]<-0} #Fills '15-20'
      if (FinalData$Length[i] >=20 & FinalData$Length[i]<25) {
        FinalData$`20-25`[i]<-1
      } else{FinalData$`20-25`[i]<-0} #Fills '20-25'
      if(FinalData$Length[i] >=25 & FinalData$Length[i]<30){
        FinalData$`25-30`[i]<-1 
      } else{FinalData$`25-30`[i]<-0} #Fills '25-30'  
      if(FinalData$Length[i] >=30){
        FinalData$`>30`[i]<-1 
      } else{FinalData$`>30`[i]<-0} #Fills '>30'  
   }

这似乎有效,但需要很长时间:

    system.time(source('~/Desktop/Home/Programming/R/Boolean Loop R.R'))
      user  system elapsed 
     94.408  19.147 118.203 

我编码的方式看起来非常笨重而效率低下。有没有更快,更有效的方式来编写这样的东西,还是我正在为我所要求的做适当的? 以下是我正在测试的一些值的示例: '长度':14.362,12.482337,8.236,16.752,12.045 如果我不清楚数据帧的结构,请点击此处截图: How my data frame is organized

2 个答案:

答案 0 :(得分:1)

您可以使用R中的剪切功能。它用于将数值转换为因子:

x<-c(1,2,4,2,3,5,6,5,6,5,8,0,5,5,4,4,3,3,3,5,7,9,0,5,6,7,4,4)
cut(x = x,breaks = c(0,3,6,9,12),labels = c("grp1","grp2","grp3","grp4"),right=F)

根据您的需要设置右=“T”或“F”。

答案 1 :(得分:0)

您可以按照以下方式进行矢量化(我制作了一些名为DF的数据样本)

DF <- data.frame(1:40000,sample(letters,1:40000,replace=T),"Length"=sample(1:40,40000,replace=T))
MyFunc <- function(x) {
  x[x >= 10 & x < 15] <- "10-15"
  x[x >= 15 & x < 20] <- "15-20"
  x[x >= 20 & x < 25] <- "20-25"
  x[x >= 25 & x < 30] <- "25-30"
  x[x > 30] <- ">30"
  x[x < 10] <- "<10"
  return(x)
}
DF$Group <- MyFunc(DF[,3])

如果它必须是6列,那么您可以修改上面的内容,为6列中的每一列分别为适当的大小和其他所有内容返回1或0。

编辑:我猜一系列ifelse可能是最好的,如果真的必须像那样的6列。

e.g。

DF$'<10' <- sapply(DF$Length, function(x) ifelse(x < 10,1,0))
相关问题