2014-04-07 60 views
0

如何在每次迭代之後保存循環中數據框中發生的更改?通過以下代碼,我想從我的數據框(df)中刪除一些等於'v'值的行。代碼運行良好,但問題是最終,只有迭代中最後一個值的結果會影響數據幀!從r中的循環中的數據幀中刪除特定的行

for (i in 1:50){ 
    v <- i+ 450 
     temp<- fn$sqldf("select count(V1) from df where V1='$v' ") 
    if (temp[1,] < 1000){ 
    g <- temp[1,] 
    c <- v 
    print(paste("Topic number: ", c, "is less than 1000, with ", g, "records")) 
    new_df<- df[df$V1 != v,] 
    } 

} 
+0

這如果我們手邊有一個可重複的例子,它會更好地工作。 http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

回答

1

更地道[R的方法是:

reduced <- subset(df, V1 > 450 & V1 <= 500) 
count <- table(reduced$V1) 
V1OK <- as.integer(names(count)[count<1000]) 
filtered <- subset(reduced, V1 %in% V1OK) 

如果你寧願用SQL爲中心的思維繼續,您的問題似乎是在創建文件3的,你從新的每次迭代生成這個(我必須猜測什麼是file_new)。你可以爲每一行標誌設置循環之前:

V1OK <- rep(FALSE, nrow(DF)) 

V1OK <- V1OK | df$V1 !=v 

內環路更新和循環之後,你就可以訪問

file_new[V1OK,] 
+0

感謝您的回答。對不起,我忘了用df更改file_new,這實際上是我的數據框的名稱。我試過你的第一個解決方案,它給了我想從我的df中刪除的數據。但是,如何將數據幀(df)與除過濾數據的其他數據相混淆呢? – MASUMEH

+0

如果我給你的是與你想要的邏輯相反的東西,你可以試試'df [!V1OK,]'? –

+0

這給了我一個有0個對象的數據框!有沒有類似%的%表示'不包含',那麼我可以在子語句中使用它? {過濾的< - 子集(減少的,V1 {?} V1OK) – MASUMEH