删除dplyr::group_之后和prcomp之前方差相等的列

删除dplyr::group_之后和prcomp之前方差相等的列,r,dplyr,pca,R,Dplyr,Pca,我正在使用dplyr为大型数据集中的多个组执行PCA。当使用group_by函数将数据分成组时,一些变量的方差相等,因此pca无法运行。如何删除任何方差相等的列,然后对剩余的列执行prcomp?下面是虚拟数据。多谢各位 为刚毛-萼片长度添加相等的方差。 检查方差是否相等 尝试排除等方差列并运行pcas 我们可以使用map\u if检查条件,然后应用函数 library(tidyverse) iris %>% group_split(Species, keep = FALSE) %&

我正在使用
dplyr
为大型数据集中的多个组执行PCA。当使用
group_by
函数将数据分成组时,一些变量的方差相等,因此pca无法运行。如何删除任何方差相等的列,然后对剩余的列执行
prcomp
?下面是虚拟数据。多谢各位

为刚毛-萼片长度添加相等的方差。 检查方差是否相等 尝试排除等方差列并运行pcas
我们可以使用
map\u if
检查条件,然后应用函数

library(tidyverse)

iris %>%
   group_split(Species, keep = FALSE) %>%
   map_if(~all(map_dbl(.x, var) != 0), ~prcomp(.x, scale. = TRUE),
          .else = function(x) return(NULL))

#[[1]]
#NULL

#[[2]]
#Standard deviations (1, .., p=4):
#[1] 1.7106550 0.7391040 0.6284883 0.3638504

#Rotation (n x k) = (4 x 4):
#                    PC1        PC2        PC3        PC4
#Sepal.Length -0.4823284 -0.6107980  0.4906296  0.3918772
#Sepal.Width  -0.4648460  0.6727830  0.5399025 -0.1994658
#Petal.Length -0.5345136 -0.3068495 -0.3402185 -0.7102042
#Petal.Width  -0.5153375  0.2830765 -0.5933290  0.5497778

#[[3]]
#Standard deviations (1, .., p=4):
#[1] 1.5667601 0.9821979 0.6725116 0.3581596

#Rotation (n x k) = (4 x 4):
#                   PC1        PC2         PC3         PC4
#Sepal.Length 0.5544765 -0.4324382  0.01239569  0.71091442
#Sepal.Width  0.4755317  0.4401787  0.75272551 -0.11626101
#Petal.Length 0.5501112 -0.4296642 -0.20236407 -0.68688796
#Petal.Width  0.4047258  0.6592637 -0.62633812  0.09627561

如果我们只想删除方差为0的列而不是整个组,我们可以使用
select\u If
来选择列

iris %>%
  group_split(Species, keep = FALSE) %>%
  map(~.x %>% select_if(~var(.) != 0) %>% prcomp(scale. = TRUE))

谢谢你的回答。如何仅删除单个列(在本例中为setosa使用sepl.Length),并对其余列运行pca,而不是完全删除数据帧?@J.Con如果我们不想删除整个数据帧,可以采取不同的方法。更新了答案。
> iris%>%
+   group_by(Species)%>%
+   group_map(~names(.[,1:4][, sapply(.[,1:4], function(v) var(v, na.rm=TRUE)==0)]))
[[1]]
[1] "Sepal.Length"

[[2]]
character(0)

[[3]]
character(0)
> iris%>%
+   group_by(Species)%>%
+   group_map(~sapply(.[,1:4], function(v) var(v, na.rm=TRUE)>0))%>%
+   group_map(~prcomp(.[,1:4], scale.=T))
Error in UseMethod("group_split") : 
  no applicable method for 'group_split' applied to an object of class "list"
library(tidyverse)

iris %>%
   group_split(Species, keep = FALSE) %>%
   map_if(~all(map_dbl(.x, var) != 0), ~prcomp(.x, scale. = TRUE),
          .else = function(x) return(NULL))

#[[1]]
#NULL

#[[2]]
#Standard deviations (1, .., p=4):
#[1] 1.7106550 0.7391040 0.6284883 0.3638504

#Rotation (n x k) = (4 x 4):
#                    PC1        PC2        PC3        PC4
#Sepal.Length -0.4823284 -0.6107980  0.4906296  0.3918772
#Sepal.Width  -0.4648460  0.6727830  0.5399025 -0.1994658
#Petal.Length -0.5345136 -0.3068495 -0.3402185 -0.7102042
#Petal.Width  -0.5153375  0.2830765 -0.5933290  0.5497778

#[[3]]
#Standard deviations (1, .., p=4):
#[1] 1.5667601 0.9821979 0.6725116 0.3581596

#Rotation (n x k) = (4 x 4):
#                   PC1        PC2         PC3         PC4
#Sepal.Length 0.5544765 -0.4324382  0.01239569  0.71091442
#Sepal.Width  0.4755317  0.4401787  0.75272551 -0.11626101
#Petal.Length 0.5501112 -0.4296642 -0.20236407 -0.68688796
#Petal.Width  0.4047258  0.6592637 -0.62633812  0.09627561
iris %>%
  group_split(Species, keep = FALSE) %>%
  map(~.x %>% select_if(~var(.) != 0) %>% prcomp(scale. = TRUE))