простой вопрос о языке в именовании - PullRequest
1 голос
/ 03 мая 2020

Я начинающий начинающий в г. У меня простой вопрос по поводу языка. Благодаря многим экспертам на этом сайте, я значительно улучшаюсь. Я всегда благодарен за это, и всем, кто протягивает руку с этим вопросом, спасибо заранее.

Это код.

Data=sample(1:5,size=25,replace=T)
names(Data)=c("a","b","c","d","e")

Я хочу назвать каждого из 1,2 От 3,4,5 до a, b, c, d, e. поэтому я подумал, что смогу выполнить это, используя верхний код.

Я знаю, что правильный код -

Data=c("a","b","c","d","e")[Data]

Но я не могу понять, почему это правильный код и зачем мне нужны последние [Данные].

Любая помощь могла бы быть полезна!! Заранее большое спасибо !!:)

Ответы [ 3 ]

3 голосов
/ 03 мая 2020

Последний Data предоставляет индекс для значений подмножества от c("a","b","c","d","e").

Давайте рассмотрим простой пример:

Рассмотрим,

a <- 1:10

Теперь, чтобы получить первое значение в a, вы можете сделать

a[1]
#[1] 1

Чтобы получить 3-е значение в a, вы можете сделать

a[3]
#[1] 3

Чтобы получить 6-е и 8-е значение в a, вы можете сделать

a[c(6, 8)]
#[1] 6 8

Что произойдет, если вы повторите определенный индекс? Скажем, вы выбираете 1 дважды и 3 раза.

a[c(1, 1, 3)]
#[1] 1 1 3

Как видите, первое значение выбирается два раза, а третье - один раз.

Теперь Data, который у вас есть, служит этим индексом для подмножества, тогда как a становится c("a","b","c","d","e")

a <- c("a","b","c","d","e")
set.seed(123)
Data=sample(1:5,size=25,replace=T)
Data
#[1] 3 3 2 2 3 5 4 1 2 3 5 3 3 1 4 1 1 5 3 2 2 1 3 4 1

Теперь вы используете эти Data значения для подмножества из a давая

a[Data]
#[1] "c" "c" "b" "b" "c" "e" "d" "a" "b" "c" "e" "c" "c" "a" "d" "a" "a" "e" "c" "b" "b" "a" "c" "d" "a"

Примечание: есть встроенная константа letters и LETTERS, которая дает 26 строчных и прописных букв.

letters
 #[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"
LETTERS
# [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"
2 голосов
/ 03 мая 2020

Вот способ, который использует преимущества того, как объекты класса "factor" кодируются внутренне в R. В R факторы кодируются как последовательные целые числа, начиная с 1, и пользователь видит их метки и уровни , а не целые значения. Но целочисленные значения не go далеко, они все еще там.

Сначала создайте вектор целых чисел, как в вопросе, но установите начальное значение ГСЧ, чтобы сделать результаты воспроизводимыми. Этот вектор сохраняется для дальнейшего использования.

set.seed(123)
Data <- sample(1:5, size = 25, replace = TRUE)
Saved <- Data

Теперь создайте коэффициент. Обратите внимание, что для атрибута меток заданы буквы "a" - "e".

Data <- factor(Data,  labels = c("a","b","c","d","e"))

Data
#  [1] c c b b c e d a b c e c c a d a a e c b b a c d a
#Levels: a b c d e

См. Внутреннее представление.

as.integer(Data)
# [1] 3 3 2 2 3 5 4 1 2 3 5 3 3 1 4 1 1 5 3 2 2 1 3 4 1

И сравните с начальными значениями.

identical(Saved, as.integer(Data))
# [1] TRUE
1 голос
/ 03 мая 2020

Это потому, что Data содержит числа, которые вы хотите назвать в том порядке, в котором вы хотите их назвать. Добавляя [Data] в конец, вы выбираете буквы в порядке Data. Чтобы понять это, попробуйте то, что делает c("a","b","c","d","e")[c(1, 2)]; он выбирает только две первые буквы. Если вместо этого вы наберете c("a","b","c","d","e")[c(5, 4)], он выберет две последние буквы, но в обратном порядке. Затем, если вы напечатаете только Data, вы увидите, что он содержит цифры от 1 до 5, то есть количество уникальных букв. Таким образом, он будет выбирать буквы в соответствии с этим порядком. Вы можете увидеть, что все числа соответствуют буквам по порядку, напечатав правильное имя Data.

Использование names(Data)=c("a","b","c","d","e") работает неправильно, поскольку вы не называете все 25 чисел, а скорее только первые пять из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...