我正在尝试找出使用cluster = sample(1:2,n,replace=T)
分配的聚类的均值。对于n=50
和函数x = rnorm(n), y=rnorm(n)
。
然后,我创建了一个数据框,以便可以看到x,y及其随机分配的簇。
data = data.frame(x,y,cluster)
然后我得到了结果:
x y cluster
1 -0.89691455 0.41765075 2
2 0.18484918 0.98175278 1
3 1.58784533 -0.39269536 1
4 -1.13037567 -1.03966898 1
5 -0.08025176 1.78222896 2
6 0.13242028 -2.31106908 2
7 0.70795473 0.87860458 2
8 -0.23969802 0.03580672 1
9 1.98447394 1.01282869 2
10 -0.13878701 0.43226515 2
我现在想做的是获取聚类的均值。也就是说,聚类1和2的平均值是什么?
所以我所做的是:
m1 = sum(data[data$C==1])/sum(data$cluster==1)
没有给我想要的价值。 我期望的是群集1和2中x和y中所有值的均值。
答案 0 :(得分:2)
我们可以尝试通过在每个sapply
集群上设置数据框的子集,然后取该数据帧中所有值的unique
来使用mean
。
with(data, sapply(sort(unique(cluster)), function(x)
mean(unlist(data[cluster == x, -3]))))
#[1] -0.1236613 -0.1849584
或类似地与split
sapply(split(data[1:2], data$cluster), function(x) mean(unlist(x)))
# 1 2
#-0.1236613 -0.1849584
我们也可以做
with(data, tapply((x + y) / 2, cluster, mean)) #suggested by @Gregor
OR
aggregate((x+y)/2~cluster,data, mean)
如@Gregor在评论中所述,您可以使用(x + y)/2)
创建一个新列,并且计算起来很容易。
数据
set.seed(1234)
n=50
data = data.frame(x = rnorm(n), y=rnorm(n),cluster = sample(1:2,n,replace=T))
答案 1 :(得分:1)
这是一种tidyverse
方法。转换为长格式并按cluster
分组。
data %>%
gather(var, value, -cluster) %>%
group_by(cluster) %>%
summarize(mean = mean(value))
# A tibble: 2 x 2
cluster mean
<int> <dbl>
1 1 -0.00152
2 2 0.327
data <- read.table(header = T, stringsAsFactors = F, text = "
x y cluster
-0.89691455 0.41765075 2
0.18484918 0.98175278 1
1.58784533 -0.39269536 1
-1.13037567 -1.03966898 1
-0.08025176 1.78222896 2
0.13242028 -2.31106908 2
0.70795473 0.87860458 2
-0.23969802 0.03580672 1
1.98447394 1.01282869 2
-0.13878701 0.43226515 2")