2017-06-13 113 views
-1

我需要一些關於如何在R中啓動實現問題的幫助。我有一個數據框,其中的行由變量「id」分組。對於每個'id'我只想保留一行。但是,我有許多標準來指定要刪除哪些行。R根據各種標準刪除行

這些都是我的一些標準:

  1. 我想保持它有「文本」 = NA(可能有幾個這樣的行)各組「身份證」中的一個隨機行;而且我也想保留該行的所有列,對於所有以下標準也是如此。
  2. 如果一個組中的所有行都有'text'== NA,那麼我想保留一個隨機行,它具有變量'check'== T(可能有幾個這樣的行)
  3. 如果所有行都在一個組具有'文本'== NA和'檢查'== F,那麼我想保留具有符合條件的變量'newtext'的行(grepl(「None」,df $ newtext))

我也可以提供一個數據集,如果這使得它更清晰。但是,我最重要的問題是,我不知道如何按照有序數量的條件來實現這種刪除行的邏輯。 這將是很好,如果任何人都可以告訴我如何實現這樣的代碼。

謝謝!

這將是一個例子的數據集:

df <- data.frame(id = c(1,1,1,2,2,2,3,3,3), 
      text=c("asd",NA,"asd",NA,NA,NA,NA,NA,NA), 
      check = c(T,F,T,T,T,F,F,F,F), 
      newtext = 
c("as","as","as","das","das","None","qwe","qwe2","None"), 
      othervars = c(1,2,3,45,5,6,6,7,1)) 

作爲輸出,我想保持下面的行: 行1或3 第4行或5 行7或8個 列othervars應保留以及我稍後需要這些信息。

希望這可以讓它更清晰一些。

+0

如果您可以提供數據集或數據集的相關部分,那將會很好。這將爲我們節省大量時間來編寫任何可以在我們衆多條件下實現的代碼。 –

+0

我添加了一個最小的數據集。希望這可以幫助! – Rnewbie

回答

0

好的,我有東西。我正在使用從dplyr到子集的未知NA,因爲我遇到了使用subset()或普通df[,]從基地R子集的問題。

數據:

df <- data.frame(id = c(1,1,1,2,2,2,3,3,3), 
      text=c("asd",NA,"asd",NA,NA,NA,NA,NA,NA), 
      check = c(T,F,T,T,T,F,F,F,F), 
      newtext = 
c("as","as","as","das","das","None","qwe","qwe2","None"), 
      othervars = c(1,2,3,45,5,6,6,7,1)) 

發起新的空數據幀:

df2 <- df[0,] 

環路採樣每id一行:

library(dplyr) 

for(i in unique(df$id)){ 
    temp <- filter(df, id == i) 
    if(nrow(filter(temp, !is.na(text))) > 0){ 
    temp <- filter(temp, !is.na(text)) 
    df2[i, ] <- temp[sample(nrow(temp), size = 1), ] 
    }else if(nrow(filter(temp, check)) > 0){ 
    temp <- filter(temp, check) 
    df2[i, ] <- temp[sample(nrow(temp), size = 1), ] 
    }else{ 
    temp <- filter(temp, !(grepl("None",temp$newtext))) 
    df2[i, ] <- temp[sample(nrow(temp), size = 1), ] 
    } 
} 

輸出例如:

> df2 
    id text check newtext othervars 
2 1 asd TRUE  as   1 
1 2 <NA> TRUE  das  45 
3 3 <NA> FALSE  qwe   6 

問候。

編輯:忽略左邊的行號,它們是循環內不同子集的殘差。

+0

感謝您的代碼。它對我的數據集運行得非常快,儘管我有大約400k的觀測值。 – Rnewbie