【问题标题】:How to speed up this code deleting certain rows?如何加快此代码删除某些行的速度?
【发布时间】:2013-12-21 19:05:38
【问题描述】:

我有一个data.frame,我想在其中删除第 5 列条目等于 0 的行。

data.frame 看起来像这样:

Column1 Column2 Column3 Column4 Column5 Column6
1       A         3       2       1       1
2       D         2       2       4       1
3       D         4       1       0       2
4       E         4       1       0       2
5       F         2       1       A       3

所以在这种情况下,应该删除第 3 列和第 4 列。我的数据框被称为

dataframe,目前我使用以下代码:

for(i in 1:length(dataframe[,1])){ 
  if (dataframe[i,5]==0) {
    dataframe2<-dataframe[-i,] 
  } 
}

问题是我有 162000 个条目,我的代码需要很长时间。那么如何才能快速实现呢?

【问题讨论】:

    标签: r performance loops dataframe


    【解决方案1】:

    我认为:

    dataframe2 <- dataframe[dataframe[,5]!=0,] 
    

    dataframe2 <- dataframe[dataframe[,"Column5"]!=0,] 
    

    dataframe2 <- subset(dataframe, Column5 != 0)
    

    正如@dickoa 建议的那样,您也可以使用$ 进行索引:

    dataframe2 <- dataframe[dataframe$Column5 != 0,] 
    

    一般:

    • 按列名索引比按数字索引更健壮且通常更具可读性(尽管在您的示例中,列名没有意义)
    • 使用[[]][,] 进行索引比使用$ 进行索引更健壮和通用(例如,您可以使用动态构建的变量名称或[[]] 中的数字索引,并且只能使用具有$
    • subset 是最易读的,但在某些情况下不太健壮

    对于您描述的规模问题,所有这些方法在速度方面应该或多或少是瞬时的/无法区分的。

    【讨论】:

    • 一个小错字,它认为是dataframe[dataframe[,5] !=0, ]
    【解决方案2】:

    您应该阅读介绍手册以了解基本子集

    df <- df[df$Column5 != 0, ]
    ##   Column1 Column2 Column3 Column4 Column5 Column6
    ## 1       1       A       3       2       1       1
    ## 2       2       D       2       2       4       1
    ## 5       5       F       2       1       A       3
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-06
      • 2013-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      相关资源
      最近更新 更多