【发布时间】:2014-10-11 23:31:34
【问题描述】:
我正在尝试使用 R 进行一些数据管理。
我有一个数据框,它包含多个变量(+200 列)和许多观察值(+10,000 行)。有很多缺失的数据,以及重复或未完成的观察。 一个观察值应该等于一个人(1 行 = 1 个唯一的人)
这是数据集示例(感谢@aosmith):
dat = data.frame(email = c(rep(c("user1@hotmail.com", "user2@gmail.com"), 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
user1@hotmail.com <NA> 2 1 NA 0 ... .
user1@hotmail.com Alfred C. 2 NA NA NA ... .
user2@gmail.com <NA> NA 3 1 NA ... .
user2@gmail.com Bob V. NA NA 0 NA ... .
<NA> Cathy L. 1 1 2 NA ... .
类似这样的东西(将行与相同的电子邮件组合并将同一个人的所有信息保留在一行中,但当我们无法识别该人与电子邮件地址相同时,也通过保留信息。所以如果email 是 NA,我们必须让它像一个独特的人一样):
email name var1 var2 var3a var3b var4 ... var200
user1@hotmail.com Alfred C. 2 1 NA NA 0 . .
user2@gmail.com Bob V. NA 3 1 0 NA . .
<NA> Cathy L. 1 1 2 . NA . .
userX@email.com . . etc etc etc etc etc etc
有没有简单的方法来做到这一点?我在 dplyr 和 tidyr 上苦苦挣扎了两天...... 最后,一行应该包含我们能够使用 email 变量识别的一个人的信息。我们还需要保留所有其他我们无法识别为属于一个人的观察结果。
感谢您的帮助和时间!
【问题讨论】:
-
你的意思是你要么有电子邮件,要么有推特,还是两者都有?缺少的电子邮件值是否与 NA 一起显示?
-
twitter 只是另一个变量,我认为它令人困惑,所以我将从示例中删除它。我们想合并来自同一个人使用他们的电子邮件地址的观察结果。
-
我更新了我的答案,这可能有帮助,也可能没有帮助。如果您放入可重现的示例数据集(您的示例数据集没有任何缺失的电子邮件值),将会有所帮助。
-
@aosmith 我更新了我的问题并添加了你建议的可复制数据集
标签: r data-manipulation