【问题标题】:Summarise data frame ignoring repetition汇总数据框忽略重复
【发布时间】:2011-02-16 12:28:48
【问题描述】:

我有一个数据框,其中一列中有重复的条目。我想根据那一列总结其他列。我希望摘要在进行摘要时考虑每个唯一条目而不是总数。 例如在下面的数据框示例中,如果我想回答被调查的人有多少是年轻、中年和老年人?“RefID”1-1 在总结中被视为计数为 1 "ageclass"=young 且不解释为 5 的计数。

RefID   Altitude    Sex ageclass
1-1 Low F   young
1-1 Low F   young
1-1 Low F   young
1-1 Low F   young
1-1 Low F   young
1-2 Low F   midage
1-2 Low F   midage
1-2 Low F   midage
1-2 Low F   midage
1-2 Low F   midage
1-2 Low F   midage
1-2 Low F   midage
1-2 Low F   midage
1-2 Low F   midage
1-2 Low F   midage
1-2 Low F   midage
1-2 Low F   midage
1-3 Low F   old
1-3 Low F   old
1-3 Low F   old
1-3 Low F   old
1-3 Low F   old
1-3 Low F   old
1-3 Low F   old
1-3 Low F   old
1-3 Low F   old
1-3 Low F   old
1-3 Low F   old
1-3 Low F   old
1-3 Low F   old
1-3 Low F   old
1-3 Low F   old
1-3 Low F   old
1-3 Low F   old
1-3 Low F   old
1-4 Low F   old
1-4 Low F   old
1-4 Low F   old
1-4 Low F   old
1-4 Low F   old
1-4 Low F   old
1-4 Low F   old
1-4 Low F   old
1-4 Low F   old
1-4 Low F   old
1-4 Low F   old
1-4 Low F   old
1-5 Low F   old
1-5 Low F   old
1-5 Low F   old
1-5 Low F   old
1-5 Low F   old
1-5 Low F   old
1-5 Low F   old
1-7 Low F   old
1-7 Low F   old
1-7 Low F   old
1-7 Low F   old
1-8 Low F   old
1-8 Low F   old
1-9 Low F   old
1-9 Low F   old
1-9 Low F   old

谢谢。

【问题讨论】:

    标签: r summary


    【解决方案1】:

    plyr 包对此很有用。例如。你可以这样做:

    > require(plyr)
    > ddply( df, .(ageclass), summarise, Num = length(unique(RefID)))
      ageclass Num
    1   midage   1
    2      old   6
    3    young   1
    

    【讨论】:

    • 感谢 Prasad,您的回复很快,解决方案有效!!
    • 我怎样才能获得每个性别(F/M)的年轻、中年和老年的数量?谢谢
    • 找到了我的问题的解决方案 ddply( df, .(ageclass,Sex), summarise, Num = length(unique(RefID))) 谢谢
    【解决方案2】:

    要获取数据框中的唯一条目,请参阅 ?uniqe :

    Data <- unique(Mydata)
    

    您可以使用:

    by(Data,Data$ageclass,summary)
    

    另请参阅?summary 以了解结果。如果您对计数感兴趣,可以使用table,例如:

    table(Data$RefID,Data$ageclass)
    

    或摘要:

    margin.table(table(Data$RefID,Data$ageclass),margin=2)
    

    编辑: 您必须小心一点,因为unique() 采用唯一的行。如果您的男性和女性都有 refID 1-1 ,那么您仍然会计算两次。但我认为您的数据并非如此。如果你真的想确定,你可以这样做:

    with(unique(Data[c(1,4)]),margin.table(table(RefID,ageclass),margin=2))
    

    或采用此处提到的plyr 解决方案。

    【讨论】:

      【解决方案3】:

      使用subset,您可以创建数据子集,使用duplicated,您可以获得一个逻辑向量,指示向量中是否已经出现了一个值。首先是一个小样本数据集:

      df <- data.frame(
         ID=rep(1:5,each=5),
         attitude="low",
         sex=c(rep("F",10),rep("M",15)),
         age=c(rep("young",5),rep("middle",10),rep("old",10))
         )
      

      然后您可以制作一个子集,其中仅记录每个 ID 第一次输入的时间:

      df.sub <- subset(df,!duplicated(df$ID))
      

      那么你可以总结一下:

      > summary(df.sub$age)
      middle    old  young 
           2      2      1 
      

      【讨论】:

        猜你喜欢
        • 2021-06-30
        • 1970-01-01
        • 2012-01-28
        • 1970-01-01
        • 1970-01-01
        • 2012-06-15
        • 2017-05-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多