2

我正在使用dplyr管道对数据集中的组运行 pcas。我从 开始group_split,所以正在处理一个列表。为了运行该prcomp()函数,只能numeric包含每个列表的列,但我希望将factor列带回以在最后进行绘图。我曾尝试在管道的中途使用保存中间输出{. ->> temp},但由于它是一个列表,我不知道如何在绘图时索引分组列。

library(tidyverse)
library(ggbiplot)

iris %>%
  group_split(Species, keep = T) %>% #group by species, one pca per species
  {. ->> temp} %>%  # save intermediate output to preserve species column for use in plotting later
  map(~.x %>% select_if(is.numeric) %>% select_if(~var(.) != 0) %>% 
        prcomp(scale. = TRUE))%>% #run pca on numeric columns only
  map(~ggbiplot(.x), label=temp$Species)#plot each pca, labeling points as species names form the temporary object

这可以为iris数据集中的每个物种生成一个 pca 图,但是由于temp$species = NULL,这些点没有被标记。

4

2 回答 2

3

如果您使用map2()并将.y参数作为物种列表传递,您可以获得我认为您想要的结果。请注意,在您的原始代码中,labels参数位于ggbiplot()函数之外并被忽略。

library(tidyverse)
library(ggbiplot)

iris %>%
  group_split(Species, keep = T) %>% 
  {. ->> temp} %>%  
  map(~.x %>% 
        select_if(is.numeric) %>%
        select_if(~var(.) != 0) %>% 
        prcomp(scale. = TRUE)) %>% 
  map2(map(temp, "Species"), ~ggbiplot(.x, labels = .y))

在此处输入图像描述

针对您的评论,如果您想添加第三个参数,您可以使用pmap()而不是map2(). 在下面的示例中,pmap()正在传递ggbiplot()参数数据的(嵌套)列表。请注意,我已经更改了new变量,使其成为一个因素,而不是跨组的常数。

iris %>%
  mutate(new = factor(sample(1:3, 150, replace = TRUE))) %>%
  group_split(Species, keep = T) %>% 
  {. ->> temp} %>%  
  map(~.x %>% 
        select_if(is.numeric) %>%
        select_if(~var(.) != 0) %>% 
        prcomp(scale. = TRUE)) %>% 
  list(map(temp, "Species"), map(temp, "new")) %>%
  pmap(~ ggbiplot(pcobj = ..1, labels = ..2, groups = ..3))

在此处输入图像描述

于 2019-09-24T06:55:11.400 回答
1

一种选择是使用splitimap

library(tidyverse)
library(ggbiplot)
iris %>%
split(.$Species) %>%  # save intermediate output to preserve species column for use in plotting later
map(~.x %>% select_if(is.numeric) %>% select_if(~var(.) != 0) %>% 
        prcomp(scale. = TRUE)) %>% 
imap(~ggbiplot(.x, labels = .y))
于 2019-09-24T06:43:31.580 回答