如何计算x = 1的y的平均值

时间:2019-02-06 01:45:32

标签: r

我正在尝试找出使用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中所有值的均值。

2 个答案:

答案 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")