【问题标题】:summary of duplicate records in the table with R用 R 汇总表中的重复记录
【发布时间】:2017-10-10 19:20:35
【问题描述】:

我在 *.csv 中有数据集,例如

a ,b
1 ,2
3 ,4
5 ,2

事实上,这是一个非常大(超过 500,000 条记录)的数据集,其中 a 为 unix 时间,b 为名称。我需要建立一个散点图,我决定在一段时间内将重复的名字计数超过 10 次,并在它们上建立一个图表。但是当我尝试

library(ggplot2)
library(plyr)

compl <- ddply(num.csv,.(b),nrow)

) 那么我在表中只有两列,并且我丢失了时间列。如何在表格中创建一个新列并在名称可重复的条件下构建图表?

这就是我的期望

a ,b ,repeatsOfB
1 ,2 ,2
3 ,4 ,1
5 ,2 ,2

并在重复次数> 10 的行上绘制一个

【问题讨论】:

    标签: r math ggplot2 plyr


    【解决方案1】:

    您可以使用包dplyr 来计算每组的记录数并过滤掉出现少于10次的记录:

    compl <- num.csv %>% # take num.csv data.frame
      group_by(a, b) %>%  # group_by a and b (similar to SQL group by)
      summarise(n = n()) %>% # count occurences of a and b
      filter(n > 10) # keep only those where number of rows is greater than 10
    

    注意:如果您不想排除带有n &lt;= 10 的行,只需删除最后一行即可。

    【讨论】:

    • summarise_(​​.data, .dots = lazyeval::lazy_dots(...)) 中的错误:缺少参数“.data”,没有默认值
    • 您需要有一个名为 num.csv 的 data.frame 对象才能使用代码。我从你问题中的例子中取了名字。
    【解决方案2】:

    我首先设置了一个最小的工作示例 - 如果我正确理解了您的问题,我们实际上并不需要时间列。 我不完全确定你真正想要绘制的内容:当有十多个时,它是否计算 b 中的个人名字?我在 tidyverse 中提出了一个解决方案(如 http://r4ds.had.co.nz 中所建议的那样)。

    我首先按列分组,计算单个实例,过滤所有出现 > 10 的事件并将其传递到 ggplot 函数中:


    library(tidyverse)
    
    # set up a minimal example:
    x <- c("a","b","c","d","e","f","g")
    data <- tibble(b=sample(x, size = 1000, replace = T))
    
    data %>% 
      group_by(b) %>% 
      count() %>% 
      filter(n>10) %>% 
      ggplot(aes(x=b, y =n)) +
      geom_col()
    

    【讨论】:

    • thx,这是有用的信息,但我需要时间数据作为 XVAR,无论如何我都会尝试您的部分解决方案
    猜你喜欢
    • 2021-10-03
    • 2023-01-31
    • 1970-01-01
    • 2019-03-26
    • 2023-04-07
    • 1970-01-01
    • 2021-02-16
    • 2022-01-20
    • 1970-01-01
    相关资源
    最近更新 更多