Pivot_wider需要保留的已知重复项

Pivot_wider with Known Duplicates that Need to Stay

提问人:user22757672 提问时间:10/27/2023 更新时间:10/27/2023 访问量:32

问:

我有参与者的数据,这些参与者的 ID 分配了多行,我正试图将它们全部放在一行上。这是因为联系人类型列在每行上都有他们的电话和电子邮件。有多个电话和电子邮件,没有一个组织良好的标签系统。有些包括拥有多个“电子邮件”的人,但电子邮件是不同的。所以你可以看到当我尝试透视时,pivot_wider会导致错误,因为两个“电子邮件”列不正确。我要么想考虑一下解决方法,比如代码自动告诉函数重新标记它,要么更有可能是 r 代码来清理有此问题的 2,000 行左右。我想它需要代码来说明是否具有相同 id 代码列的行的标签第二次或第三次重复出现,以在标签末尾添加 2 或 3。我想对了吗?有没有更简单的方法?

这就是它的设置方式。我尝试过的代码发现的重复项比 2,000 个左右的重复项更多,联系人类型问题就像有多个 Peters 一样,但不同的 ID 被卷入其中。即使您无法提供代码。我的想法是否正确?这是解决此问题的唯一方法吗?

dat1 <- data.frame(Participant = c("Peter", "Peter", "Peter", "Peter", "Peter", "Peter",
                                   "Carol", "Carol", "Carol", "Carol", "Carol", "Carol"),
                   GroupID = c(1, 1, 2, 2, 3, 3, 3, 3, 4, 5, 5, 5),
                   Phone.Type = c("Email", "Email", "Email", "Phone", "Office", "Home","Home", "Home", "Other", "Website", "Fax", "Office Fax"), GroupTheme = c("[email protected]", "[email protected]", "[email protected]", 1234567890, 0987654321, 587290164389, 36237862873, 34384738923, 43432894274, "website.com", 32489789432, 23467832648937))
r 转置

评论

0赞 Jon Spring 10/27/2023
你能展示你想要的输出是什么吗?如果可以的话,建议如何获得它会更容易。

答:

0赞 Mark 10/27/2023 #1

tl;这个答案的 DR 是,如果你的真实数据与样本数据类似,那么最好将其保留为较长的格式。

为了说明这一点,以下是我为使数据变宽所做的工作:

> dat1 |> pivot_wider(names_from = Phone.Type, values_from = GroupTheme)
# A tibble: 6 × 10
  Participant GroupID Email     Phone     Office    Home   Other  Website Fax   
  <chr>         <dbl> <list>    <list>    <list>    <list> <list> <list>  <list>
1 Peter             1 <chr [2]> <NULL>    <NULL>    <NULL> <NULL> <NULL>  <NULL>
2 Peter             2 <chr [1]> <chr [1]> <NULL>    <NULL> <NULL> <NULL>  <NULL>
3 Peter             3 <NULL>    <NULL>    <chr [1]> <chr>  <NULL> <NULL>  <NULL>
4 Carol             3 <NULL>    <NULL>    <NULL>    <chr>  <NULL> <NULL>  <NULL>
5 Carol             4 <NULL>    <NULL>    <NULL>    <NULL> <chr>  <NULL>  <NULL>
6 Carol             5 <NULL>    <NULL>    <NULL>    <NULL> <NULL> <chr>   <chr> 
# ℹ 1 more variable: `Office Fax` <list>
Warning message:
Values from `GroupTheme` are not uniquely identified; output will contain list-cols.

请注意几件事:首先,末尾的警告。这是因为每一行都是一个人,而第 1 组中的 Peter 列出了两封电子邮件,因此我们得到了列表列。其次,NULL 值数量大,这是因为样本数据非常稀疏。

以这种方式做事实际上并不是组织数据的最糟糕的方式——如果真实数据包含每个人的更多信息,那可能是件好事——实际上最糟糕的方法是为每个潜在事物创建单独的列——比如说,为了论证,如果你的数据集中有一个人列出了 9 个不同的电话号码, 数据集的每一行现在都有一个 Phone1、Phone2、Phone3 一直到 Phone9 列,大多数值为 NULL,如示例所示。可以想象,这会占用大量空间,速度很慢,而且很难使用——比如说,如果你想检查某个电话号码,找到与之关联的人,现在需要检查十个不同的列(这很慢,很丑,很难编码)。

总而言之,以下是您的选择:

  1. 保持数据不变(如果数据稀疏,那么可能是最佳选择)
  2. 像上面一样让它变宽(并处理列表列) - 如果你的数据很密集并且你对列表列没问题,那么可能是最好的(做而不是x %in% yx == y)
  3. 为额外的值制作额外的列(真的是坏主意,避免)
  4. (如果可能的话)删除额外的值(例如,如果您了解何时收集数据,则删除除最后收集的电子邮件之外的每封电子邮件(听起来这实际上是一个数据问题,而不是编码问题 - 数据集本身听起来有点混乱,所以没有任何简单的选择)