Вектор поднабора R для замены NA - PullRequest
1 голос
/ 05 мая 2019

Я относительно новичок в R, и я наткнулся на код, который используется для замены NA новыми значениями не-NA, которые я не до конца понимаю, пожалуйста, кто-нибудь может мне это объяснить?:

Это код:

z  <- !is.na(a)                  
z  <- z | !cumsum(z)             
y  <- a[z][cumsum(z)]

У меня есть вектор "a", который содержит числа и NA:

a<-c(1,NA,NA,NA,3,4,5,NA,5,5,5,NA,NA,NA)

, запустив первую строку, я получаю "z", котораяявляются логическими значениями вектора "a":

> z
 [1]  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE

, поэтому теперь я знаю, что если я хочу получить доступ к первому элементу вектора, я могу просто использовать символ "[" для подстановки числа 1:

> a[1]
[1] 1

аналогично, если мне нужны первые 3 элемента:

> a[1:3]
[1]  1 NA NA

Почему при вводе следующего значения происходит подстановка значений ИСТИНА?Разве не предполагается возвращать снова весь вектор, включая АН?потому что z является вектором всех логических значений ...

> a[z]
[1] 1 3 4 5 5 5 5

Подмножество FALSE, по-видимому, равно

> a[!z]
    [1] NA NA NA NA NA NA NA

Наконец, я могу понять накопительную функцию "cumsum":

> cumsum(z)
 [1] 1 1 1 1 2 3 4 4 5 6 7 7 7 7

но я не понимаю, почему, набрав:

> a[z][cumsum(z)]

, он возвращает:

[1] 1 1 1 1 3 4 5 5 5 5 5 5 5 5

Что означает «[] []»?Я знаю, что, например, набрав

> a[z][1]

, я могу получить доступ к первому элементу логических значений TRUE

[1] 1

, но не получаю третью строку кода.

1 Ответ

2 голосов
/ 05 мая 2019

Здесь 'z' является логическим vector, то есть имеющим значения ИСТИНА / ЛОЖЬ. Когда мы делаем cumsum (накопленная сумма), при каждом значении «ИСТИНА» добавляется 1

cumsum(z)
[1] 1 1 1 1 2 3 4 4 5 6 7 7 7 7

Теперь давайте посмотрим на

a[z]
#[1] 1 3 4 5 5 5 5

Здесь значения 'a' получили подмножество соответствующих элементов значений TRUE в 'z'

Когда мы используем cumsum(z) в качестве индекса, он говорит, что первые 4 элемента должны быть значением в позиции 1 из a[z], 5-й элемент должен быть из позиции 2 в a[z], 6-й из позиции 3 в a[z] и т. Д. ... Короче говоря, значения в a[z] реплицируются на основе индекса из cumsum(z)

a[z][cumsum(z)]
#[1] 1 1 1 1 3 4 5 5 5 5 5 5 5 5

, что совпадает с rep

rep(a[z], c(4, 1, 1, 2, 1, 1, 4))
#[1] 1 1 1 1 3 4 5 5 5 5 5 5 5 5

или

rep(a[z], tabulate(cumsum(z)))

Чтобы понять, как это работает, может быть лучше использовать некоторые операторы print в цикле for

for(i in cumsum(z)) {
   cat("cumulative sum vector", paste(cumsum(z), collapse=","), sep="\n")
  cat(paste0("cumulative sum of z index i: ", i), sep="\n")
  cat("value of a[z] vector:", paste(a[z], collapse=","), sep= "\n")
  cat("value of a[z] from indexing", a[z][i], sep="\n") 
  cat("----------------")
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...