R-обработка данных не выполняет функцию во всем наборе данных

#r #dataset #lubridate #data-wrangling

#r #набор данных #lubridate #обработка данных

Вопрос:

Я готовлю набор данных для дальнейшего анализа. Для этого я делаю сдвиг во времени — дни (60) и записываю результат в новый столбец. Обычно это не сложно, но компьютер не выполняет это полностью. Несколько строк, которые не вычисляются.

 df$acquisition_time=as.POSIXct(df$acquisition_time, format = "%Y-%m-%d %H:%M:%OS")
df$acqui_timeshift <- df$acquisition_time - days(60)
 

Здесь я поместил скриншот, на котором вы видите проблему:
введите описание изображения здесь

«NA» в углу продолжается дальше. Набор данных составляет 1,3 миллиона строк. Так что, может быть, мощности компьютера недостаточно? ОШИБКА отсутствует: или ПРЕДУПРЕЖДЕНИЕ: от R

было бы неплохо, если бы кто-нибудь мог помочь мне с этой странной проблемой!

Большое спасибо!

Лучше всего, Кристиан

     data<- structure(list(ani_id_year = c("982_year2019", "982_year2019", 
"985_yearNA", "996_yearNA"), month = c("02", "02", "05", "05"
), year = c(2020, 2020, 2018, 2018), year_ts = c(2019, 2019, 
NA, NA), acquisition_time = structure(c(1581310879, 1581782462, 
1527120030, 1527120052), class = c("POSIXct", "POSIXt"), tzone = ""), 
    day = c("02-10", "02-15", "05-24", "05-24"), x = c(382992.722829081, 
    384653.805434133, 387585.792076463, 388305.553482353), y = c(5419798.49669287, 
    5420068.44700148, 5411757.45423474, 5401584.90172328), groupid = c(3L, 
    3L, 3L, 2L), name = c(982L, 982L, 985L, 996L), name_echte = c("Tana", 
    "Tana", "Zita", "Berta"), nr = c(1351995L, 1352125L, 
    1370437L, 1278038L)), row.names = c(1256187L, 1256317L, 1281322L, 
1343545L), class = "data.frame")
 

извините, я действительно не знаю, как добавить это сюда, я использовал dpud() для получения кода..

Комментарии:

1. Можете ли вы добавить воспроизводимый пример? Вы не связали данные, поэтому мы можем только догадываться, что происходит не так.

2. Похоже, вы используете View() для просмотра своих данных. В больших наборах данных могут возникать проблемы / задержки при отображении материала при прокрутке вниз. Чтобы проверить, действительно ли в нем много пропусков acqui_timeshift , используйте sum(is.na(df$acqui_timeshift)) .

3. @PLY Я сделал все возможное, я не могу привести таблицу в порядок, есть ли простой инструмент для этого? @benimwolfspelz да, я пробовал это, и есть NAs, также, пока я продолжаю работать с таблицей «df $ aquitimeshift«? …

Ответ №1:

Я не смог воспроизвести ту же ошибку, используя то, что было предоставлено. Но я могу подтвердить, что способ, которым вы вычисляете acqui_timeshift , работает. (Если вы отфильтруете входные данные только до тех наблюдений, которые приводят к acqui_timeshift is NA , и предоставите эти отфильтрованные данные в качестве воспроизводимого примера, я могу повторить попытку здесь.)

Использование data предоставленного в настоящее время

 # Method 1 - Using lubridate days() ----------------------------------------

df$acquisition_time <- as.POSIXct(df$acquisition_time, format = "%Y-%m-%d %H:%M:%OS")
df$acqui_timeshift <- df$acquisition_time - days(60)

#           ani_id_year   acquisition_time    acqui_timeshift
# 1256187   982_year2019  2020-02-10 05:01:19 2019-12-12 05:01:19
# 1256317   982_year2019  2020-02-15 16:01:02 2019-12-17 16:01:02
# 1281322   985_yearNA    2018-05-24 00:00:30 2018-03-25 00:00:30
# 1343545   996_yearNA    2018-05-24 00:00:52 2018-03-25 00:00:52

# Method 2 - Using base R difftime() ----------------------------------------

df$acquisition_time = as.POSIXct(df$acquisition_time, format = "%Y-%m-%d %H:%M:%OS")
df$acqui_timeshift <- df$acquisition_time - as.difftime(60, unit="days")

#           ani_id_year  acquisition_time    acqui_timeshift
# 1256187   982_year2019 2020-02-10 05:01:19 2019-12-12 05:01:19
# 1256317   982_year2019 2020-02-15 16:01:02 2019-12-17 16:01:02
# 1281322   985_yearNA   2018-05-24 00:00:30 2018-03-25 00:00:30
# 1343545   996_yearNA   2018-05-24 00:00:52 2018-03-25 00:00:52
 

Выделение того aquisition_time , что было создано NA на вашем скриншоте

 # Method 1 - Using lubridate days() ----------------------------------------

as.POSIXct("2019-05-30 02:00:38", tz = "UTC", format = "%Y-%m-%d %H:%M:%OS") - days(60)
# "2019-03-31 02:00:38 UTC"

# Method 2 - Using base R difftime() ----------------------------------------

as.POSIXct("2019-05-30 02:00:38", tz = "UTC", format = "%Y-%m-%d %H:%M:%OS") - as.difftime(60, unit="days")
# "2019-03-31 02:00:38 UTC"