如何加快删除某些行的代码?

时间:2013-12-21 19:05:39

标签: r performance loops dataframe

我有data.frame我要删除第5列条目等于零的行。

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个条目,我的代码需要很长时间。那么我怎样才能快速实现呢?

2 个答案:

答案 0 :(得分:2)

我想:

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

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

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

正如@dickoa建议您也可以使用$索引:

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

一般来说:

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

对于您所描述的尺寸问题,所有这些方法在速度方面应该或多或少地瞬间/无法区分。

答案 1 :(得分:1)

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

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
希望它有所帮助。