【问题标题】:R - data frame to frequency tableR - 数据帧到频率表
【发布时间】:2021-06-27 20:04:47
【问题描述】:

我在 R 中有以下数据框 test

   test <- data.frame(
        ID = c(1,1,2,2,2),
        Color = c("green","blue",rep("green",3)))

    > test
      ID Color
    1  1 green
    2  1  blue
    3  2 green
    4  2 green
    5  2 green

我想要的输出是显示每个 ID 不同颜色数量的频率表。例如,

    > desired_output
    
       1    2 <NA> 
       1    1    0 

我使用下面的 dplyr 代码来产生这个结果:

    test_2 <- test %>% 
      group_by(ID) %>% 
      mutate(nDistColors = n_distinct(Color)) %>% 
      ungroup() %>% 
      as.data.frame() %>% 
      select(ID,nDistColors) %>% 
      distinct()

    desired_output <- table(test_2$nDistColors, useNA = "always")

我经常看到这样的事情,所以我想知道是否有更好的方法来编写代码来实现这个结果。特别是我觉得我记得使用了一个不需要线条的功能

      select(ID,nDistColors) %>% 
      distinct()

如果我不必存储对象 test_2 也会很好,但是当我直接输入表格时,它会将格式更改为我不喜欢的 2 路频率表. 这可以避免吗?我在管道链中看不到指定我想要频率的列的方法:

    test %>% 
     group_by(ID) %>% 
     mutate(nDistColors = n_distinct(Color)) %>% 
     ungroup() %>% 
     as.data.frame() %>% 
     select(ID,nDistColors) %>% 
     distinct() %>% 
      table(useNA = "always")
          nDistColors

    ID     1 2 <NA>
      1    0 1    0
      2    1 0    0
      <NA> 0 0    0

【问题讨论】:

    标签: r dataframe dplyr subset


    【解决方案1】:

    可以用summarise 代替mutate 使其简洁,从而避免执行distinct 的步骤。此外,可以pull 列'n' 并在其上应用table,而不是将输出存储到临时对象中

    library(dplyr)
    test %>% 
        group_by(ID) %>% 
        summarise(n = n_distinct(Color), .groups = 'drop') %>%
        pull(n) %>% 
        table(useNA = 'always')
    # 1    2 <NA> 
    # 1    1    0 
    

    【讨论】:

    • 总结!就是这样。谢谢 - 如果不在这里询问,我无法弄清楚谷歌找到什么。我也不知道 pull 方法。
    • 总结(没有双关语)- 1.“拉”是指定哪个字段“进入”表? 2. ".groups = 'drop'" 有什么作用?
    • @PrinceM 1. 在您的代码中,test_2$nDistColors 将列提取为vectorpull 在“n”汇总列上做同样的事情。 2. .groups = 'drop' 在这里并不真正需要,因为只有一个组变量,默认情况下它会删除最后一个分组列)。但是使用.groups = 'drop' 可以避免意外并删除那些如果您在 RMD 上编写可能会产生影响的警告消息
    • 和“ungroup”类似吗?
    • @PrinceM 你可以在这些步骤之后执行ungroup,但它仍然可能会显示来自summarise的警告消息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多