如何计算每组中唯一名称的数量

时间:2013-09-07 08:39:37

标签: r sorting unique repeat

任何人都可以告诉我如何在R中完成以下操作吗?我想计算每组中的独特人数,如下面的示例所示,第一列对应于每个组(这里有3个组),第二列表示人名(例如,在组1中,人A的名字显示3次。第三列是我要在R中生成的那一列(如果某个人的姓名在某个组中显示x次,那么最后一列应该表示x)。谢谢大家!

    x <- read.table(header=T, text="group peoplename noofuniquepeople
1 A 3
1 B 1
1 A 3
1 A 3
1 D 1
2 M 1
2 K 2
2 T 3
2 T 3
2 K 2
2 T 3
3 E 2
3 F 1
3 E 2
3 G 2
3 G 2
3 V 1")

4 个答案:

答案 0 :(得分:2)

使用avewithin

within(x, Freq <- ave(1:nrow(x), peoplename, group, FUN=length))

答案 1 :(得分:1)

理想情况下,您应该先放入您尝试过的内容。我们可以帮您调试。

无论如何,

> df = data.frame(N = c("A","B","A","A","D","M","K","T","T","K","T","E","F","E","G","G","V"), G = c(3,1,3,3,1,1,2,3,3,2,3,2,1,2,2,2,1))
> df
   N G
1  A 3
2  B 1
3  A 3
4  A 3
5  D 1
6  M 1
7  K 2
8  T 3
9  T 3
10 K 2
11 T 3
12 E 2
13 F 1
14 E 2
15 G 2
16 G 2
17 V 1

> numberOfGroups = length(unique(df$G))
> numberOfGroups
[1] 3

> require(plyr)
> uniqueInGroup <- dlply(df,.fun=unique,.variables=.(G))
> uniqueInGroup
$`1`
  N G
1 B 1
2 D 1
3 M 1
4 F 1
5 V 1

$`2`
  N G
1 K 2
3 E 2
5 G 2

$`3`
  N G
1 A 3
4 T 3

attr(,"split_type")
[1] "data.frame"
attr(,"split_labels")
  G
1 1
2 2
3 3

lapply(uniqueInGroup, function(x) return(length(unique(x$N))))

哎呀,把第三个小组作为小组。改为使用1st col运行此脚本,您将获得所需的输出。

答案 2 :(得分:1)

可能有更好的方法,但

x$gp     <- paste(x$group, x$peoplename)
x_new    <- merge (x, table(x$gp), by.x="gp", by.y="Var1")
x_new$gp <- NULL

产生

> x_new
   group peoplename noofuniquepeople Freq
1      1          A                3    3
2      1          A                3    3
3      1          A                3    3
4      1          B                1    1
5      1          D                1    1
6      2          K                2    2
7      2          K                2    2
8      2          M                1    1
9      2          T                3    3
10     2          T                3    3
11     2          T                3    3
12     3          E                2    2
13     3          E                2    2
14     3          F                1    1
15     3          G                2    2
16     3          G                2    2
17     3          V                1    1

和最后两列是相同的

答案 3 :(得分:1)

使用优秀的旧base::aggregate这有利于(在我看来)聚合您的数据,以便为该组中的每个grouppeoplename显示一行。 length给出了这种组合发生的次数:

aggregate( . ~ peoplename + group , data = x , FUN = length )
#   peoplename group noofuniquepeople
#1           A     1                3
#2           B     1                1
#3           D     1                1
#4           K     2                2
#5           M     2                1
#6           T     2                3
#7           E     3                2
#8           F     3                1
#9           G     3                2
#10          V     3                1

顺便说一下,如果您输入的数据缺少noofuniquepeople列(我认为这是因为您想要计算它),您不需要它。您可以使用虚拟变量进行聚合,如下所示:

Unique = rep( 1 , nrow(x) )
aggregate( Unique ~ peoplename + group , data = x , FUN = sum )