значение скобок в R программировании по уровням - PullRequest
0 голосов
/ 03 июля 2018
l1 = factor(sample(letters,size=10,replace=TRUE))
l2 = factor(sample(letters,size=10,replace=TRUE))
l12 = factor(c(levels(l1)[l1],levels(l2)[l2]))

Примечание: буквы дают строчные буквы.

В приведенном выше примере, не могли бы вы объяснить, что означает (l1) [l1] и (l2) [l2] в строке 3.

Мои образцы и результаты:

> l1
 [1] y h f r x q y p d o
Levels: d f h o p q r x y

> l2
 [1] n n v d s h k w y q
Levels: d h k n q s v w y


> l12
 [1] y h f r x q y p d o n n v d s h k w y q
Levels: d f h k n o p q r s v w x y

1 Ответ

0 голосов
/ 13 марта 2019

Когда после имени появляется открывающая скобка (, R будет обрабатывать все, что приходит перед скобками, как функцию и передает все внутри скобки этой функции в качестве аргументов. .

Я начинаю с этого, потому что функции оцениваются с высоким приоритетом, поэтому "Что означает (l1)[l1]" - это неправильный вопрос, сначала levels(l1), а затем [l1] результат levels(l1).

Например:

log(1:3)

Вызывает функцию log() для вектора 1, 2, 3.

log(c(1, 5, 7))

Вызывает функцию c() 1, 5, 7 для создания вектора 1, 5, 7, затем вызывает функцию log() для вектора 1, 5, 7.

log(c(1, 5, 7))[2]

Вызывает функции c(), а затем log(), как описано выше, а затем вызывает функцию [ для результата, извлекая 2-й элемент результата log().

factor( c( levels(l1)[l1], levels(l2)[l2] ) ) # some spaces added for clarity
  • Вызывает функцию levels() для объекта l1
    • выводит результат с [, основываясь на значениях в l1
  • Вызывает функцию levels() для объекта l2
    • выводит результат с [, основываясь на значениях в l2
  • Звонит c() по результатам, упомянутым выше
  • Вызов factor() по результату c()

Что делает levels(l1)[l1]? Насколько я могу судить, это странный способ получить тот же результат, что и as.character(l1):

set.seed(47) # for reproducibility
l1 = factor(sample(letters, size = 10, replace = TRUE))
l2 = factor(sample(letters, size = 10, replace = TRUE))

l1
#  [1] z j t v o r k m o y
# Levels: j k m o r t v y z
levels(l1)
# [1] "j" "k" "m" "o" "r" "t" "v" "y" "z"
levels(l1)[l1]
# [1] "z" "j" "t" "v" "o" "r" "k" "m" "o" "y"
identical(as.character(l1), levels(l1)[l1])
# [1] TRUE

Итак, в целом, я думаю, что цель factor(c(levels(l1)[l1], levels(l2)[l2])) состоит в том, чтобы объединить векторы l1 и l2, с коэффициентом в результате. Я думаю, что более ясный способ сделать это -

factor(c(as.character(l1), as.character(l2)))
#  [1] z j t v o r k m o y d s e p n x k a b m
# Levels: a b d e j k m n o p r s t v x y z
...