Я пытаюсь проанализировать набор данных, который содержит около 10000 наблюдений (строк) с 18 переменными (столбцами) данных о продажах. Есть 9 числовых переменных, 8 факторных переменных и 1 символьная переменная (имя области). Я планирую использовать функции из пакета PCAmixdata из пакета R для проведения анализа pca, поскольку считаю, что он обрабатывает смешанные данные (числовые и категориальные).
Чтобы подготовиться к pca, я масштабирую числовые переменные с помощью функции base-R scale () в цикле «for». Этот цикл просто перебирает имена переменных и масштабирует числовые столбцы, оставляя нечисловые столбцы без изменений (включая код). Я подтверждаю успех этой операции, проверяя str (df) впоследствии.
Однако, когда я пытаюсь использовать функцию PCAmixdata 'splitmix ()', чтобы разделить df на числовую матрицу и не числовую матрицу, это - то, где у меня возникают проблемы. Функция splitmix должна создавать числовую матрицу и не числовую матрицу. Нечисловая матрица создается должным образом, но создаваемая числовая матрица имеет значение NULL.
Чтобы еще больше усугубить ситуацию, если я запускаю функцию splitmix () без предварительного масштабирования числовых значений, то функция работает, как и ожидалось! Я немного сбит с толку - масштабирование, похоже, вызывает проблему, но я не могу понять, что или почему. Любые идеи будут высоко оценены. Спасибо
# Here is a subset of data to reproduce issue (please excuse me, I'm not
# sure of better way to share this without attaching a file or portion of it).
# install.packages("varhandle")
library(varhandle) # just used for the 'unfactor()' function below
df <- as.data.frame(matrix(c(
514400, 60000, "Free", 188600, "Yes", "0-1", "No", 84.52065, 28.3019, 12.5, 0, 12.9707, 8.29346, "Bld60s", "TypSemiD", "HardStnd", "BedThree", "area-9",
525000, 71000, "Lease", 177800, "Yes", "0-1", "No", 98.45262, 14.6342, 6.25, 0, 5.3571, 8.29268, "Bld80s", "TypDetch", "GarSingl", "BedFive", "area-2",
528700, 48500, "Free", 168800, "No", "2plus", "Yes", 87, 14.0187, 16.6667, 8.3333, 3.0769, 3.75235, "PreWW1", "TypFlat", "HardStnd", "BedTwo", "area-6",
534700, 45000, "Free", 171600, "No", "0-1", "No", 83.96337, 35.7143, 0, 0, 14.717, 3.90244, "BldIntWr", "TypSemiD", "GarDbl", "BedThree", "area-8",
534000, 260000, "Free", 168400, "Yes", "2plus", "No", 190.40366, 7.4074, 9.0909, 0, 3.6765, 8.22222, "Bld80s", "TypDetch", "GarDoubl", "BedFour", "area-5"), nrow=5, byrow=TRUE))
colnames(df) <- c("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r")
# Re-format dataset to resemble original dataset. Note the dataset I have does
# not require 'unfactor()' call, I've just used it here to make sure the
# format of this dataset is the same as my original dataset. The 'str()' call
# after confirms that.
df[,c(1,2,4,8,9,10,11,12,13,18)] <- unfactor(df[,c(1,2,4,8,9,10,11,12,13,18)])
str(df)
# scale data
# for loop to iterate through df's col names, scale only numeric cols
for (colName in names(df)) {
# Check if the column contains numeric data.
if(class(df[,colName]) == 'integer' | class(df[,colName]) == 'numeric')
{
# Scale this column (scale() function applies z-scaling).
df[,colName] <- scale(df[,colName])
} # end if
} # end for
library(PCAmixdata) # for 'splitmix()
split <- splitmix(df) # identify the classes of the cols to be used
X1 <- split$X.quanti
X2 <- split$X.quali
summary(X1)
summary(X2)