任何人都可以告诉我如何在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")
答案 0 :(得分:2)
使用ave
和within
:
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
这有利于(在我看来)聚合您的数据,以便为该组中的每个group
和peoplename
显示一行。 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 )