Замена пропущенных значений на значение с запаздыванием в векторе, считанном из файла Excel - PullRequest
0 голосов
/ 18 мая 2018
 Animal ID
1      38-L
2      <NA>
3      39-L
4      <NA>
5      40-L
6      <NA>
etc.

Я читаю приведенные выше данные из электронной таблицы Excel.Затем я хочу удалить -L и -R из вектора, преобразовать их в числовые и заменить отсутствующие значения на число, приведенное выше.

Мой код выглядит следующим образом:

SugarData <- as.data.frame(read_excel(InFile[2], sheet = "Data for stats (+RN) (+FA)", range = "D1:D161"))
head(SugarData)
BirdNumber <- as.numeric(str_replace_all(SugarData[, 1], "[-LR]", ""))
for (i in seq(1, length(BirdNumber) - 1, by = 2)) {
  BirdNumber[i + 1] <- BirdNumber[i]
}
SugarData[1] <- BirdNumber

Это работает, но моя проблема двоякая.

Когда я читаю это как tibble, функция str_replace_all не работает, как я ожидал, и я думаю, что, возможно, есть более элегантный способ сделать это.

Надеюсь, что кто-то может помочь.

С уважением, Алан.

Моя главная проблема заключается в том, что когда я читаю данные в виде таблицы, а затем использую:

BirdNumber <- str_replace_all(SugarData[, 1], "[-LR]", "")

Я получаю следующее:

"c(\"38\", NA, \"39\", NA, \"40\", NA, \"41\", NA, \"42\", NA, \"44\", NA, \"45\", NA, \"46\", NA, \"49\", NA, \"53\", NA, \"158\", NA, \"159\", NA, \"161\", NA, \"163\", NA, \"164\", NA, \"166\", NA, \"167\", NA, \"168\", NA, \"169\", NA, \"170\", NA, \"398\", NA, \"400\", NA, \"401\", NA, \"403\", NA, \"404\", NA, \"405\", NA, \"407\", NA, \"408\", NA, \"409\", NA, \"410\", NA, \"521\", NA, \"522\", NA, \"523\", NA, \"524\", NA, \"525\", NA, \"526\", NA, \"527\", NA, \"529\", NA, \"530\", NA, \"533\", \nNA, \"578\", NA, \"580\", NA, \"581\", NA, \"582\", NA, \"584\", NA, \"585\", NA, \"588\", NA, \"589\", NA, \"590\", NA, \"593\", NA, \"602\", NA, \"605\", NA, \"606\", NA, \"607\", NA, \"608\", NA, \"609\", NA, \"610\", NA, \"611\", NA, \"612\", NA, \"616\", NA, \"702\", NA, \"705\", NA, \"706\", NA, \"707\", NA, \"708\", NA, \"709\", NA, \"710\", NA, \"711\", NA, \"712\", NA, \"713\", NA, \"821\", NA, \"822\", NA, \"823\", NA, \"824\", NA, \"826\", NA, \"827\", NA, \"828\", NA, \"830\", NA, \"831\", \nNA, \"832\", NA)"

1 Ответ

0 голосов
/ 21 мая 2018

Вы используете str_replace_all, который возвращает список, вместо этого вы должны попытаться использовать str_replace, вы также можете использовать gsub из базы R.

library(stringr)
zoo::na.locf(as.numeric(str_replace(dat$`Animal ID`,"-(L|R|LR)$","")))

Логика :

str_replace найдет шаблон на основе столбца 'Animal ID' с заданным регулярным выражением.Преобразование выполняется с использованием as.numeric, а затем заменяется отсутствующими значениями на последнее не пропущенное значение над строками с использованием функции zoo пакета locf (перенос последнего наблюдения).

Данные согласно заданному OPв комментариях:

structure(list("Animal ID" = c("38-L", NA, "39-L", NA, "40-L", NA, "41-L", NA, "42-L", NA)), .Names = "Animal ID", row.names = c(NA, 10L), class = "data.frame")

Вывод :

> zoo::na.locf(as.numeric(str_replace(dat$`Animal ID`,"-(L|R|LR)$","")))
 [1] 38 38 39 39 40 40 41 41 42 42
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...