2014-10-11 90 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