Построение различных фигур для точек данных, принадлежащих разным группам в R

Я пытаюсь построить первые два столбца друг против друга матрицы Y и присвоить разным точкам данных разные формы и цвета в зависимости от того, к какой группе они принадлежат в 12-м столбце моего набора данных. Ниже мой код:

 X <- as.matrix(course[,1:11])
 S <- cov(X)
 l <- eigen(S)$values
 e <- eigen(S)$vector
 Y <- X %*% e

plot(Y[,1:2],
     xlab = "PC1",
     ylab = "PC2",
     pch = c(1, 17, 8)[as.numeric(course[,12])],  # different 'pch' types 
     main = "Plot of first 2 Principle Components",
     col = c(1, 8, 1)[as.numeric(course[,12])]
     )

«курс» — это набор данных, с которым я работаю, а Y — это матрица, которую я хочу использовать для своего графика. Однако одна из групп, на которой я основываю свою маркировку, - это в основном отсутствующие значения или «NA». Я не могу использовать as.numeric(), поскольку он не обрабатывает значения «NA» как числовые.

Когда я запускаю код с графика, я получаю два набора значений, и он полностью игнорирует значения для NA.

Я был бы очень признателен за помощь.


person Community    schedule 11.11.2013    source источник


Ответы (1)


Вы должны иметь возможность создать вектор значений pch перед вызовом plot(). Вы можете сделать это с помощью ?ifelse. , Например. Скорее всего, будет удобно иметь категорию с NAs в качестве последнего else, чтобы вам не требовался сложный аргумент сопоставления. Сохраните это в переменной (вы можете назвать ее myPch), а затем используйте эту переменную в своем вызове функции. То есть,

# assuming there are 3 courses: "A", "B", & "C", but some C's are NA's
myPch <- ifelse(course[,12]=="A", 1, ifelse(course[,12]=="B", 17, 8) )
plot(..., pch=myPch, ...)  
person gung - Reinstate Monica    schedule 11.11.2013
comment
Но pch - это аргумент сюжета, как мне указать вектор, назначающий определенные pch различным значениям. Кроме того, я попробовал аргумент if else следующим образом: course[,12] ‹- ifelse(is.na(course[,12]),0,course[,12]), но он все еще не работает. Я попытался перемаркировать его как отсутствующий вместо 0, но не повезло. Я получаю только два разных типа очков, тогда как мне нужно три. - person ; 11.11.2013
comment
На самом деле вы не предоставили воспроизводимый пример, поэтому я Я ограничен в том, что могу вам показать, но я попытаюсь что-нибудь придумать, и мы посмотрим, достаточно ли этого, чтобы донести идею. - person gung - Reinstate Monica; 11.11.2013
comment
курс ‹- read.table(course_happy_nomiss.txt, header = TRUE) level(course$Year) ‹- список(MSc_4 = c(MSc, 4), 3 = c(3)) › курс[,12] [1] 3 3 MSc_4 MSc_4 ‹NA› 3 MSc_4 MSc_4 3 3 3 3 3 3 [16] 3 3 3 MSc_4 MSc_4 MSc_4 3 3 3 3 3 ‹NA› MSc_4 3 MSc_4 [31] 3 3 3 3 3 MSc_4 3 3 ‹NA › ‹NA› 3 MSc_4 MSc_4 MSc_4 3 [46] MSc_4 ‹NA› 3 3 3 MSc_4 MSc_4 ‹NA› 3 3 MSc_4 ‹NA› ‹NA› MSc_4 MSc_4 [61] MSc_4 MSc_4 3 Уровни: MSc_4 3 - person ; 11.11.2013
comment
это все, что у меня есть. также я заметил, что команда ifelse, которую я включил, возвращает числовые значения для всех моих значений, несмотря на то, что я указал ее только для значений NA - person ; 11.11.2013
comment
Вы хотите, чтобы команда ifelse выводила только числовые значения. В частности, вы хотите, чтобы он выводил числа для символов, которые вы хотите использовать. Вы должны использовать его так, как я написал, просто замените фактические значения для A, B и C. NB, я не совсем понимаю ваш вывод выше, у вас есть 2 разных кодирования значений для одного и того же курса? - person gung - Reinstate Monica; 11.11.2013
comment
Я думаю, что решил это, используя это: course[,12] ‹- ifelse(is.na(course[,12]),3,course[,12]) теперь работает код графика, который я использовал выше - person ; 11.11.2013