【问题标题】:counting of distinct values in R [duplicate]R中不同值的计数[重复]
【发布时间】:2016-12-25 18:31:04
【问题描述】:

我有一个数据列表作为大数据框架的一部分,它是按时间排序的,所以我不能改变列表的顺序:

ID <-  c("p","fxman27","duncane" ,"duncane" ,"dday1026" ,"duncane","dday1026","dday1026" ,"dday1026" ,"dday1026","cesandjoel","pali777","ranger_2","marymom6" , "deaglekl")

现在我需要一个函数来生成这些 ID 的计数:

 s<-c(1 , 2  ,3 , 3 , 4,  4  ,4 , 4 , 4  ,4 , 5,  6,  7,  8 , 9)

如您所见,函数计数不同 ID 的数量,如果 ID 在前一行中相同,则保持不变。 我不想使用“for”循环,而更喜欢 BASE 函数。

“s”不是简单的频率表,因为我知道我可以使用聚合。 这不是一个分组问题,但“当前 ID”的数量是拍卖 谢谢

【问题讨论】:

  • 使用plyr 包中的count 函数。 plyr::count(ID)
  • 试试match(ID, unique(ID))
  • @JakeConway 这不会提供所需的输出
  • count 只是给了我频率。我已经有了频率,如果“ID”发生变化,我需要“s”向量作为变化,并保持不变,因为“ID”没有变化!
  • 问题其实是重复的。 cumsum(!duplicated(ID))(@DavidArenburg 提供的链接中的答案)可以重现您的结果,但 match(ID,unique(ID)) 不能,因为 match 函数不会检查具有较小下标的元素的重复项。

标签: r count


【解决方案1】:

您可以计算不重复的 ID:

cumsum(!duplicated(ID))
# [1] 1 2 3 3 4 4 4 4 4 4 5 6 7 8 9

【讨论】:

    【解决方案2】:

    如果您的数据集很大,使用 dplyr 可能会更好,但这解决了仅使用基本函数的示例:

    apply(as.matrix(1:length(ID)), 1, function(n) length(unique(ID[1:n])))
    

    【讨论】:

    • 这是一个循环。另外,这里的 dplyr 是如何关联的?最后,为什么要将向量转换为矩阵而不只是在其上使用sapply
    • 我在考虑使用dplyr::n_distinct。你是对的,sapply(1:length(ID), function(n) length(unique(ID[1:n]))) 可能是最好的实现。但是,@psidom 的方法最终更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 2013-11-16
    相关资源
    最近更新 更多