【发布时间】:2019-02-27 18:51:45
【问题描述】:
我一直在处理具有缺失变量的数据集:
> 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 则没有簇号的值。
- 如何实现?
更新
按照 cmets 中的建议,我创建了一个 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),.))
【问题讨论】:
-
我会为您的整个表创建一个行 ID,在数据子集上生成您的集群,并使用行 ID 将子集
left join恢复为原始数据。 -
rowid_to_column()fromtibble让您轻松生成该 ID -
谢谢,这会产生问题,因为我必须将 rowid 变量包含到 kmeans 聚类过程中,见上文。
-
在下面查看我的答案。