【问题标题】:Duplicate Identifiers - How to Dynamically Spread Repeating Values in a Column using Tidyverse重复标识符 - 如何使用 Tidyverse 在列中动态传播重复值
【发布时间】:2018-04-19 04:33:45
【问题描述】:
library(tidyverse)  

这个问题的灵感来自 Jake Kaupp 对问题 “tidyr/dplyr - 为重复的 ids 传播多个变量”的回答。使用提供的示例数据(底部),我希望每行只有一个 ID,但是有一些重复 ID 的实例(148 和 188)。由于有不同的电话号码,我想动态地分散这些号码,以便每个号码都有一列。在我的真实数据集中,我不确定会有多少重复的 ID,这会不断变化。我想在 Tidyverse 中完成所有这些,但我被困住了:

首先,我使用下面的代码来找到所需的最大列数...

cols <-Df %>% 
group_by(Id) %>%
group_size() %>% 
max()

接下来,我想做类似下面的代码,但不推荐使用“separate_”。我不确定在这里使用什么?我用 tidyr::spread 尝试了各种尝试,并查看了解决重复标识符的其他选项,例如添加索引列 (mutate(I=row_numbers()),但也无法使其正常工作。

Df%>%
group_by(Id) %>%
separate_("Ph1", paste0("1:3", 1:cols), sep = ",", fill = "right") 

有没有一种简单的方法可以做到这一点?动态方面很重要,因为数据集总是会发生变化,最终我想将这部分作为函数的一部分。

样本数据:

Id<-c(199,148,148,145,177,165,144,121,188,188,188,111)
Ph1<-c(6532881717,6572231223,6541132112,6457886543,6548887777,7372222222,6451123425,6783450101,7890986543,6785554444,8764443344,6453348736)
Ph2<-c(NA,NA,NA,NA,NA,7372222222,NA,NA,NA,6785554444,NA,NA)

Df<-data.frame(Id,Ph1,Ph2)

【问题讨论】:

    标签: r dplyr tidyr


    【解决方案1】:

    您可以创建一个新列,为给定 Id 的每个电话号码分配一个唯一 ID,然后使用该新列进行传播。这避免了“重复 id”问题。在传播时,这种方法会根据需要添加尽可能多的列,以容纳每个 Id 的所有唯一电话号码。例如,在下面的代码中,我将新列称为 seq(代表“序列”):

    library(tidyverse)
    
    Df %>% 
      gather(key, value, -Id) %>%
      filter(!is.na(value)) %>% 
      select(-key) %>% 
      group_by(Id) %>% 
      filter(!duplicated(value)) %>% 
      mutate(seq=paste0("Phone_",1:n())) %>% 
      spread(seq, value)
    
         Id    Phone_1    Phone_2    Phone_3
    1   111 6453348736         NA         NA
    2   121 6783450101         NA         NA
    3   144 6451123425         NA         NA
    4   145 6457886543         NA         NA
    5   148 6572231223 6541132112         NA
    6   165 7372222222         NA         NA
    7   177 6548887777         NA         NA
    8   188 7890986543 6785554444 8764443344
    9   199 6532881717         NA         NA
    

    【讨论】:

      猜你喜欢
      • 2017-09-01
      • 2018-07-01
      • 2018-02-04
      • 1970-01-01
      • 2014-11-15
      • 2019-06-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多