计算r中的聚类内的均值

时间:2019-10-03 13:47:07

标签: r average

我有一个数据集如下:

id <- c(1,1,1,2,2,2,3,3,3,3)
text.id <- c(1,1,1,1,1,1,2,2,2,2)
item.id <- c(1,2,3,1,2,3,1,2,3,4)
score <- c(30,30, 30, 42, 42, 42, 60,60,60,60)

data <- data.frame("id"=id,"text.id"=text.id, "item.id"=item.id, "score"=score)
> data
   id text.id item.id score
1   1       1       1    30
2   1       1       2    30
3   1       1       3    30
4   2       1       1    42
5   2       1       2    42
6   2       1       3    42
7   3       2       1    60
8   3       2       2    60
9   3       2       3    60
10  3       2       4    60

每个item.id都嵌入每个text.id中。例如,text.id=1中包含三个项目。 text.id=3包含四个项目,依此类推。但是,在text.id秒中,每个item.id的得分都是相同的。我想做的是,对于每个id(学生),应该通过除以每个text.id中的项目数来平均分数。 数据集如下所示:

> data
   id text.id item.id score mean
1   1       1       1    30   10
2   1       1       2    30   10
3   1       1       3    30   10
4   2       1       1    42   13
5   2       1       2    42   13
6   2       1       3    42   13
7   3       2       1    60   15
8   3       2       2    60   15
9   3       2       3    60   15
10  3       2       4    60   15

有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用ave来获得每个ID的length,并用它来划分score

data$mean  <- data$score/ave(data$score, data$id, FUN=length)
data
#   id text.id item.id score mean
#1   1       1       1    30   10
#2   1       1       2    30   10
#3   1       1       3    30   10
#4   2       1       1    42   14
#5   2       1       2    42   14
#6   2       1       3    42   14
#7   3       2       1    60   15
#8   3       2       2    60   15
#9   3       2       3    60   15
#10  3       2       4    60   15

日期:

x <- aggregate(cbind(mean=item.id) ~ text.id, data=data, FUN=function(x) {length(unique(x))})
data <- merge(data, x)
data$mean  <- data$score / data$mean
data
#   text.id id item.id score mean
#1        1  1       1    30   10
#2        1  1       2    30   10
#3        1  1       3    30   10
#4        1  2       1    42   14
#5        1  2       2    42   14
#6        1  2       3    42   14
#7        2  3       1    60   15
#8        2  3       2    60   15
#9        2  3       3    60   15
#10       2  3       4    60   15

更新2:

x <- aggregate(cbind(mean=item.id) ~ text.id + id, data=data, FUN=function(x) {length(unique(x))})
data <- merge(data, x)
data$mean  <- data$score / data$mean
data
#   id text.id item.id score mean
#1   1       1       1    30   10
#2   1       1       2    30   10
#3   1       1       3    30   10
#4   2       1       1    42   14
#5   2       1       2    42   14
#6   2       1       3    42   14
#7   3       2       1    60   15
#8   3       2       2    60   15
#9   3       2       3    60   15
#10  3       2       4    60   15

答案 1 :(得分:1)

使用for i in 1..<self.imagesStrip.count{ autoreleasepool { ,我们可以做到

dplyr

library(dplyr) data %>% group_by(id) %>% mutate(mean_sc = score/n()) # id text.id item.id score mean_sc # <dbl> <dbl> <dbl> <dbl> <dbl> # 1 1 1 1 30 10 # 2 1 1 2 30 10 # 3 1 1 3 30 10 # 4 2 1 1 42 14 # 5 2 1 2 42 14 # 6 2 1 3 42 14 # 7 3 2 1 60 15 # 8 3 2 2 60 15 # 9 3 2 3 60 15 #10 3 2 4 60 15

data.table