Kmeans кластер обратно в исходный набор данных, который включал пропущенные значения - PullRequest
0 голосов
/ 27 февраля 2019

Я работал в наборе данных с переменными, которые представляют пропуски:

> dt %>%
+     as_tibble() 
# A tibble: 652 x 5
   z_pos_2grp z_neg_2grp z_dis_2grp z_iq_2grp condit
        <dbl>      <dbl>      <dbl>     <dbl> <chr> 
 1    NA          NA         NA        NA     2     
 2    NA          NA         NA        NA     2     
 3    -0.0828      0.328     -0.473    -1.23  1     
 4     0.260       0.328     -0.222    -0.441 1     
 5    NA          NA         NA        NA     2     
 6    -0.769      -0.943     -0.725     0.607 3     
 7    NA          NA         NA        NA     NA    
 8    NA          NA         NA        NA     5     
 9    -0.769      -0.943     -0.473     2.44  3     
10    -0.769      -0.943     -0.725     0.607 3 

Я хотел выполнить кластеризацию без данных в этих данных, что означает, что мне нужно изолировать переменные, которые меня интересуют в кластеризации(z_pos_2grp, z_neg_2grp, z_dis_2grp, z_iq_2grp) и удалите NA.Итак, я выполнил:

dt %>%
    select(z_pos_2grp, z_neg_2grp, z_dis_2grp, z_iq_2grp) %>%
    filter(!is.na(z_pos_2grp) & !is.na(z_neg_2grp) & !is.na(z_dis_2grp) & !is.na(z_iq_2grp)) %>%
    do(augment(kmeans(cbind(.$z_pos_2grp, .$z_neg_2grp, .$z_dis_2grp, .$z_iq_2grp), nstart = 1000, centers = 3),.))

Это приводит к желаемым результатам, создается новый столбец с кластером kmeans, однако я хотел расширить этот столбец до исходного набора данных.Таким образом, номера кластеров находятся в правильных строках, а NA остаются без значения для номера кластера.

  • Как этого достичь?

ОБНОВЛЕНИЕ

Как предлагается в комментариях, я создал переменную rowid и оставил в подмножестве оригинал.Это, однако, создает проблему, мне нужно передать переменную rowid в процедуру kmeans, которая не является идеальной.Как это можно решить?Возможно, есть чистое решение для dplyr.Смотрите ниже код:

ided <- dt %>%
    as_tibble() %>%
    tibble::rowid_to_column("rowid")

with_clusters<- ided %>%
    as_tibble() %>%
    select(rowid, z_pos_2grp, z_neg_2grp, z_dis_2grp, z_iq_2grp) %>%
    filter(!is.na(z_pos_2grp) & !is.na(z_neg_2grp) & !is.na(z_dis_2grp) & !is.na(z_iq_2grp)) %>%
    do(augment(kmeans(cbind(.$z_pos_2grp, .$z_neg_2grp, .$z_dis_2grp, .$z_iq_2grp), nstart = 1000, centers = 3),.))

1 Ответ

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

dplyr обеспечивает хорошую семантическую функциональность, но я не чувствую необходимости делать что-то более сложное, чем необходимо.Вот решение, основанное исключительно на базовых функциях.При необходимости вы можете перевести обратно на синтаксис dplyr:

#make some random data
x <- data.frame(x1 = rnorm(10), x2 = rnorm(10), x3 = rnorm(10))
#set some NAs in 1st, 7th, and 10th row
x[1,1] <- NA
x[7,2] <- NA
x[10,3] <- NA
#add an ID
x$id <- 1:nrow(x)

#subset of the rows that aren't missing any data
x_complete <- x[complete.cases(x), ]
#run kmeans cluster
set.seed(1)
x_complete$cluster <- kmeans(x_complete[, c("x1", "x2", "x3")], centers = 2)$cluster
#merge back
x_out <- merge(x, x_complete[, c("id", "cluster")], by = "id", all.x = TRUE)
x_out
#>    id          x1         x2         x3 cluster
#> 1   1          NA -0.2504685 -1.8068897      NA
#> 2   2  0.33502109  0.8645490 -0.1011722       1
#> 3   3  0.59668757  0.4612197  0.5527592       1
#> 4   4  0.14814590  0.4826441  0.6722468       1
#> 5   5 -0.52928021  0.9350622 -0.4802504       1
#> 6   6 -0.15841780  0.3299728  1.3266988       2
#> 7   7  0.20500487         NA  0.9150747      NA
#> 8   8 -0.15215172 -0.7769925  1.4218571       2
#> 9   9  0.04083744 -0.4304241  1.7355289       2
#> 10 10 -0.22238132 -1.3202234         NA      NA

Создано в 2019-02-27 с помощью пакета Представить (v0.2.1)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...