总结数据框,忽略重复

时间:2011-02-16 12:28:48

标签: r summary

我有一个数据框,其中一列中有重复的条目。我想根据那一列总结其他列。我希望摘要在编制摘要时考虑每个唯一条目而不是总计数。 例如,在下面的数据框示例中,如果我想回答关于有多少人被调查的年轻人,中年人和老年人的问题?“RefID”1-1在摘要中被视为1的计数“ageclass”=年轻,不解释为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

谢谢。

3 个答案:

答案 0 :(得分: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解决方案。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

使用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