将主要组件作为变量添加到数据框中

时间:2013-11-13 11:07:23

标签: r variables dataframe pca

我正在处理一个包含10000个数据点和100个变量的数据集。不幸的是,我所拥有的变量没有以良好的方式描述数据。我使用prcomp()进行了PCA分析,前3台PC似乎占据了数据的大部分可变性。据我了解,主要成分是不同变量的组合;因此它具有对应于每个数据点的特定值,并且可以被视为新变量。我能将这些主要组件作为3个新变量添加到我的数据中吗?我需要它们进行进一步分析。

可重现的数据集:

set.seed(144)
x <- data.frame(matrix(rnorm(2^10*12), ncol=12))
y <- prcomp(formula = ~., data=x, center = TRUE, scale = TRUE, na.action = na.omit)

2 个答案:

答案 0 :(得分:11)

PC分数存储在prcomp()结果的元素x中。

str(y)

List of 6
 $ sdev    : num [1:12] 1.08 1.06 1.05 1.04 1.03 ...
 $ rotation: num [1:12, 1:12] -0.0175 -0.1312 0.3284 -0.4134 0.2341 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:12] "X1" "X2" "X3" "X4" ...
  .. ..$ : chr [1:12] "PC1" "PC2" "PC3" "PC4" ...
 $ center  : Named num [1:12] 0.02741 -0.01692 -0.03228 -0.03303 0.00122 ...
  ..- attr(*, "names")= chr [1:12] "X1" "X2" "X3" "X4" ...
 $ scale   : Named num [1:12] 0.998 1.057 1.019 1.007 0.993 ...
  ..- attr(*, "names")= chr [1:12] "X1" "X2" "X3" "X4" ...
 $ x       : num [1:1024, 1:12] 1.023 -1.213 0.167 -0.118 -0.186 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:1024] "1" "2" "3" "4" ...
  .. ..$ : chr [1:12] "PC1" "PC2" "PC3" "PC4" ...
 $ call    : language prcomp(formula = ~., data = x, na.action = na.omit, center = TRUE, scale = TRUE)
 - attr(*, "class")= chr "prcomp"

您可以使用y$x获取这些内容,然后选择所需的列。

x.new<-cbind(x,y$x[,1:3])
str(x.new)

'data.frame':   1024 obs. of  15 variables:
 $ X1 : num  1.14 2.38 0.684 1.785 0.313 ...
 $ X2 : num  -0.689 0.446 -0.72 -3.511 0.36 ...
 $ X3 : num  0.722 0.816 0.295 -0.48 0.566 ...
 $ X4 : num  1.629 0.738 0.85 1.057 0.116 ...
 $ X5 : num  -0.737 -0.827 0.65 -0.496 -1.045 ...
 $ X6 : num  0.347 0.056 -0.606 1.077 0.257 ...
 $ X7 : num  -0.773 1.042 2.149 -0.599 0.516 ...
 $ X8 : num  2.05511 0.4772 0.18614 0.02585 0.00619 ...
 $ X9 : num  -0.0462 1.3784 -0.2489 0.1625 0.6137 ...
 $ X10: num  -0.709 0.755 0.463 -0.594 -1.228 ...
 $ X11: num  -1.233 -0.376 -2.646 1.094 0.207 ...
 $ X12: num  -0.44 -2.049 0.315 0.157 2.245 ...
 $ PC1: num  1.023 -1.213 0.167 -0.118 -0.186 ...
 $ PC2: num  1.2408 0.6077 1.1885 3.0789 0.0797 ...
 $ PC3: num  -0.776 -1.41 0.977 -1.343 0.987 ...

答案 1 :(得分:0)

Didzis Elferts的响应仅在您的数据x没有NA的情况下有效。如果您的数据确实具有NA,则可以按照以下方法添加组件。

library(tidyverse)

components <- y$x %>% rownames_to_column("id")

x <- x %>% rownames_to_column("id") %>% left_join(components, by = "id")