Последние наблюдения не перенесены с использованием fill или na.locf для символьных переменных - PullRequest
0 голосов
/ 20 марта 2020

У меня есть data.table, сгенерированный fread, в котором некоторые столбцы содержат NA s. Я хотел бы заполнить значения для этих указанных c столбцов последними доступными данными из предыдущей строки (механизм "Последнее наблюдение перенесено").

Я пробовал zoo * na.locf в сочетании с dplyr mutate_at и tidyr функцией заполнения для заполнения этих NA.

library(dplyr) ## needed for mutate_at
library(tidyr) ## needed for fill
library(data.table) ## needed for fread
library(zoo) ## needed for na.locf

tempImport <- fread(test_filename, header = T, check.names = T, drop = "V198") %>% ## read in csv
     mutate_at(vars(VP:frameRate), na.locf)

tempImport <- fread(test_filename, header = T, check.names = T, drop = "V198") %>% ## read in csv
     fill(VP:frameRate)

Оба они обычно возвращались без ошибок и работали для int и num переменные, но не для переменных char (один и тот же вывод str для обоих вариантов сверху).

> str(tempImport[1093:1094, 192:197])
'data.frame':   2 obs. of  6 variables:
 $ VP             : int  1 1
 $ condition      : int  2 2
 $ date           : chr  "2020_Feb_24_0905" ""
 $ expName        : chr  "Ment_Rot" ""
 $ psychopyVersion: chr  "3.2.4" ""
 $ frameRate      : num  59.9 59.9

Я знаю, что data.table nafill не работает с char переменные. Это также верно для na.locf и fill? Я не смог найти ничего в документации. Если так: есть ли возможность заполнить эти char переменные предыдущими значениями? Кроме того: эти NA s обычно only встречаются в этих столбцах в строке last . Однако, поскольку я хочу использовать код для пакетного сценария, я не знаю номер индекса последней строки для каждого вывода fread. Я был бы открыт для обходных решений для достижения чего-то сопоставимого с вышеупомянутыми решениями.

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Не уверен, если это ваш главный вопрос, но:

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

Да, есть a hack :

DT <- data.table(x = c("hi", NA, NA, "ho", NA, "bye"))
DT[, x[nafill(replace(.I, is.na(X), NA), "locf")]]
# [1] "hi"  "hi"  "hi"  "ho"  "ho"  "bye"

Относительно:

не знаю порядковый номер последней строки для каждого вывода фреда

Вы можете использовать .N для выбора последней строки:

DT[.N]
fread("file.csv")[.N]
0 голосов
/ 21 марта 2020

Есть простое решение для data.table

dt <- data.table(v = c("A", "A", NA, "B", NA))
dt[, v:=v[1], by=cumsum(!is.na(v))]
dt
...