Как рассчитать среднее значение у для х = 1 - PullRequest
0 голосов
/ 06 февраля 2019

Я пытаюсь определить среднее значение кластеров, которые я назначил, используя 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)

Что не дает мне желаемого значения.То, что я ожидал, было средним из всех значений x и y, объединенных в кластер 1 и 2.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Вот метод 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")
0 голосов
/ 06 февраля 2019

Мы могли бы попытаться использовать 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

ИЛИ

aggregate((x+y)/2~cluster,data, mean)

Как уже упоминалось @Gregor в комментариях, вы можете создатьновый столбец с (x + y)/2) и будет легко для расчетов.

data

set.seed(1234)
n=50
data = data.frame(x = rnorm(n), y=rnorm(n),cluster = sample(1:2,n,replace=T))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...