Kmeans聚类回到包含缺失值的原始数据集中

时间:2019-02-27 18:51:46

标签: r dplyr

我一直在处理一个数据集,该数据集带有表示缺失的变量:

> 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变量并将left_join子集放入原始变量中。但是,这产生了一个问题,我需要将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 :(得分:0)

<?xml version="1.0"?> <Org> <Department name="Environmental"> <Division>Engineering</Division> <Address>123 Elm Street</Address> </Department> </Org> 提供了一些不错的语义功能,但是我不觉得强迫做一些不必要的事情。这是一个完全依赖基本功能的解决方案。您可以根据需要转换回dplyr语法:

dplyr

reprex package(v0.2.1)于2019-02-27创建