2014-10-11 84 views
0

我試圖用R來做一些數據管理。在R中合併類似觀察

我有一個數據框,作爲多個變量(+200列)和許多觀察(+10,000行)。有很多缺失的數據,以及重複或未完成的觀察結果。 一個觀察應該等於一個人(1行= 1獨一無二的人)

這裏是集例子(感謝對@aosmith):

dat = data.frame(email = c(rep(c("[email protected]", "[email protected]"), each = 2), NA), 
       name = c(NA, "Alfred C.", NA, "Bob V.", "Cathy L."), 
       var1 = c(2, 2, NA, NA, 1), 
       var2 = c(1, NA, 3, NA, 1), 
       var3 = c(NA, NA, 1, 0, 2), 
       var4 = c(0, NA, NA, NA, NA)) 

我要合併我的觀察,這樣到底,一行等於一個人。識別我使用電子郵件的人。當沒有電子郵件時,我想保留所有觀察結果(所以如果電子郵件丟失,我不希望R刪除觀察結果。每個觀察,因爲沒有電子郵件被認爲是一個獨特的觀察)。

對於我們可以找到相同電子郵件地址的時代,我們需要R來更新每個變量的字段,當我們發現後續觀察(使用相同的電子郵件地址)時,我們得到的數據缺失數據。如果已經存在一個或多個變量的現有數據,我們希望R創建一個新的變量來存儲不同的值。

下面是一個例子,使這更容易理解。

我們需要改變這樣的:通過保持信息時

  email  name var1 var2 var3 var4 ... var200 
[email protected]  <NA>  2 1 NA 0 ... . 
[email protected] Alfred C. 2 NA NA NA ... . 
    [email protected]  <NA> NA 3 1 NA ... . 
    [email protected]  Bob V. NA NA 0 NA ... . 
      <NA> Cathy L. 1 1 2 NA ... . 

進入這個像這樣(具有相同的電子郵件相結合的行和保持所有信息在一行中同一個人,但也我們無法確定該人的電子郵件地址相同的,所以,如果郵件是NA,我們必須保持它,如果它是一個獨特的人):

  email   name  var1 var2 var3a var3b var4 ... var200 

    [email protected]  Alfred C.  2  1  NA  NA  0  .  . 
    [email protected]  Bob V.  NA  3  1  0  NA  .  . 
       <NA>  Cathy L.  1  1  2  .  NA  .  . 
    [email protected]   .   .  etc etc  etc etc etc etc 

是否有一個簡單的方法來做到這一點?我在dplyr和tidyr兩天裏苦苦掙扎...... 最後,一行應該包含我們能夠使用電子郵件變量識別的一個人的信息。我們還需要保留所有其他我們無法識別屬於一個人的觀察結果。

謝謝你的幫助和時間!

+0

你的意思是你有電子郵件,推特或兩者兼而有之? NA中顯示缺少的電子郵件值? – aosmith 2014-10-12 15:40:03

+0

twitter只是另一個變量,我認爲它很混亂,所以我會從示例中刪除它。我們想要使用他們的電子郵件地址合併來自同一人的觀察結果。 – leakciM 2014-10-12 16:23:58

+0

我更新了我的答案,這可能有幫助,也可能沒有幫助。如果您將可重現的示例數據集(您的示例數據集沒有任何缺少的電子郵件值),它會有所幫助。 – aosmith 2014-10-12 17:41:56

回答

3

我想出了一個選項,以防您不知道主題中每個變量會有多少個值。您會看到大部分步驟都是爲此(爲單獨的列創建單獨的名稱)。

該過程是使用gather將數據集轉換爲長格式,刪除每個主題和變量組合的缺失值和重複值,爲每個變量有多個值時添加變量名稱(添加b,c等)。到變量名稱的末尾),然後使用spread將數據集恢復爲寬格式。

dat = data.frame(email = rep(c("[email protected]", "[email protected]"), each = 2), 
        twitter = c(NA, "user1", NA, "user2"), 
        var1 = c(2, 2, NA, NA), 
        var2 = c(1, NA, 3, NA), 
        var3 = c(NA, NA, 1, 0), 
        var4 = c(0, NA, NA, NA)) 
library(dplyr) 
library(tidyr) 

dat %>% 
    gather(allvar, value, twitter:var4) %>% 
    group_by(email, allvar) %>% 
    filter(!is.na(value) & !duplicated(value)) %>% 
    mutate(allvar2 = paste0(allvar, c("", letters[2:26])[1:n()])) %>% 
    ungroup() %>% 
    select(-allvar) %>% 
    spread(allvar2, value, convert = TRUE) 

Source: local data frame [2 x 7] 

       email twitter var1 var2 var3 var3b var4 
1 [email protected] user1 2 1 NA NA 0 
2 [email protected] user2 NA 3 1  0 NA 

編輯新例如,當一些電子郵件地址丟失

我不完全清楚,如果你總是有兩種Twitter或電子郵件信息或兩者 - 如果是這樣,我認爲這有可能成爲通過在@ jazurro的回答中填寫na.locf來簡化填寫Twitter,並使用email和twitter的組合作爲分組變量。

爲了不讓行,沒有電子郵件,你可以過濾出來,你需要的一切,然後rbind_list他們回去。在這種情況下命名重複的變量,例如,var3var3b將制定出適合你(這是可能的將它們命名爲var3a,var3b,但不適用於此綁定方法)。

dat = data.frame(email = c(rep(c("[email protected]", "[email protected]"), each = 2), NA), 
        twitter = c(NA, "user1", NA, "user2", "user3"), 
        var1 = c(2, 2, NA, NA, 1), 
        var2 = c(1, NA, 3, NA, 1), 
        var3 = c(NA, NA, 1, 0, 2), 
        var4 = c(0, NA, NA, NA, NA)) 

dat %>% 
    filter(!is.na(email)) %>% # filter out rows with missing email 
    gather(allvar, value, twitter:var4, na.rm=TRUE) %>% 
    group_by(email, allvar) %>% 
    distinct(value) %>% 
    mutate(allvar2 = paste0(allvar, c("", "b")[1:n()])) %>% # Name duplicated variables, ex: var3, var3b 
    # OP gets error using n(); use length(value) instead 
    ungroup() %>% 
    select(-allvar) %>% 
    spread(allvar2, value, convert = TRUE) %>% # Make sure spread converts variables appropriately 
    rbind_list(.,dat[is.na(dat$email),]) # rbind rows with missing email 

Source: local data frame [3 x 7] 

       email twitter var1 var2 var3 var3b var4 
1 [email protected] user1 2 1 NA NA 0 
2 [email protected] user2 NA 3 1  0 NA 
3    NA user3 1 1 2 NA NA 
+0

+1。我還沒有嘗試過,但我喜歡這個樣子。 – shadowtalker 2014-10-12 01:54:19

+0

謝謝你的回答。我讓我的例子更清楚。我使用我的數據進行了測試,但是它將變量「email」和所有X作爲觀察結果留給我......我試圖找出原因。 – leakciM 2014-10-12 15:05:37

+0

我看到twitter可能令人困惑......它只是一個變量。我在例子中編輯它。我試圖運行代碼 – leakciM 2014-10-12 16:22:08