代码之家  ›  专栏  ›  技术社区  ›  captcoma

具有重复观察的长数据到具有摘要列的短数据[重复]

  •  0
  • captcoma  · 技术社区  · 6 年前

    我想转换具有重复观察的长数据集:

    obs code
    1    A
    2    B
    4    G
    2    D
    1    H
    3    K
    

    到一个“较短”的数据集中,其中包含一个逗号分隔的摘要列:

    obs  code
    1    A,H
    2    B,D
    3    K
    4    G
    

    我试过这样的方法:

    df <- data.frame(obs=c("1","2","4","2","1","3"), code=c("A","B","G","D","H","K"),stringsAsFactors = F)
    
    
    df %>% group_by(obs) %>%
      mutate(id=1:n()) %>% 
      spread(id,code) %>%
      replace_na(list(`1` = "", `2` = "")) %>%
      unite(new,2:3, remove=FALSE,sep=",")
    

    然而,这为obs 3和4提供了额外的“”。 有没有更好的方法来解决我的问题?

    2 回复  |  直到 6 年前
        1
  •  3
  •   akrun    6 年前

    而不是 spread ing为“宽”格式,然后使用 replace_na ,这可以更直接地通过 paste 在中输入“代码” summarise group_by

    df %>%
      group_by(obs) %>%
      summarise(code = toString(code))
    
        2
  •  1
  •   Maurits Evers    6 年前

    下面是一个基本的R解决方案,使用 aggregate 作为替代方案:

    with(df, aggregate(code, by = list(obs = obs), toString));
    #  obs    x
    #1   1 A, H
    #2   2 B, D
    #3   3    K
    #4   4    G
    

    如果你不想在 code s、 你可以 paste0 条目(而不是使用 toString ):

    with(df, aggregate(code, by = list(obs = obs), paste0, collapse = ","));
    #  obs   x
    #1   1 A,H
    #2   2 B,D
    #3   3   K
    #4   4   G