расширить строки для пропущенных наблюдений - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть набор данных, который был собран с использованием 100 м разрезов.Во время сбора данных записывалось «0», если ничего не было обнаружено на всем разрезе.Если что-то было обнаружено, записывали «1» вместе с расстоянием вдоль разреза с интервалами 20 м (20, 40, 60, 80, 100).Например;

Location Year Month Visit Air.Temp Transect Distance Present
Site1    2015 Feb   1     22.5      A       20       1
Site1    2015 Feb   1     22.5      A       40       1
Site1    2015 Feb   1     22.5      A       80       1
Site1    2015 Feb   1     23.0      B       20       1
Site1    2015 Feb   1     21.5      C       100      0
Site1    2015 Feb   2     24.0      A       80       1

Я хотел бы расширить свой набор данных, чтобы он включал строку для каждого 20-метрового интервала, в котором производился поиск, добавляя «0» на расстояниях, где ничего не было записано, и сохраняя связанные данныес этим конкретным разрезом (например, место, год, месяц, посещение, температура и т. д.).Например, мой желаемый вывод для вышеупомянутого был бы:

Location Year Month Visit Air.temp Transect Distance Present
Site1    2015 Feb   1     22.5      A       20       1
Site1    2015 Feb   1     22.5      A       40       1
Site1    2015 Feb   1     22.5      A       60       0
Site1    2015 Feb   1     22.5      A       80       1
Site1    2015 Feb   1     22.5      A       100      0 
Site1    2015 Feb   1     23.0      B       20       1
Site1    2015 Feb   1     23.0      B       40       0
Site1    2015 Feb   1     23.0      B       60       0
Site1    2015 Feb   1     23.0      B       80       0
Site1    2015 Feb   1     23.0      B       100      0
Site1    2015 Feb   1     21.5      C       20       0
Site1    2015 Feb   1     21.5      C       40       0
Site1    2015 Feb   1     21.5      C       60       0
Site1    2015 Feb   1     21.5      C       80       0
Site1    2015 Feb   1     21.5      C       100      0
Site1    2015 Feb   2     24.0      A       20       0
Site1    2015 Feb   2     24.0      A       40       0
Site1    2015 Feb   2     24.0      A       60       0
Site1    2015 Feb   2     24.0      A       80       1
Site1    2015 Feb   2     24.0      A       100      0

Я попробовал подход expand.grid, который был предложен для аналогичных вопросов, но в моем случае он выдает ошибку памяти, потому что кадр данных егопытается произвести слишком большой (на самом деле, мой набор данных имеет больше столбцов измеряемых переменных и> 1000 строк).

Любая помощь очень ценится!Благодарю.

1 Ответ

0 голосов
/ 07 декабря 2018

Вариант 1: использование full_join на nest редактируемых данных

skel <- data.frame(Distance = seq(20, 100, 20))

library(tidyverse)
df %>%
    group_by_at(vars(Location:Transect)) %>%
    nest() %>%
    mutate(data = map(data, ~full_join(.x, skel, by = "Distance"))) %>%
    unnest() %>%
    replace_na(list(Present = 0))
## A tibble: 20 x 8
#   Location  Year Month Visit Air.Temp Transect Distance Present
#   <fct>    <int> <fct> <int>    <dbl> <fct>       <dbl>   <dbl>
# 1 Site1     2015 Feb       1     22.5 A              20       1
# 2 Site1     2015 Feb       1     22.5 A              40       1
# 3 Site1     2015 Feb       1     22.5 A              80       1
# 4 Site1     2015 Feb       1     22.5 A              60       0
# 5 Site1     2015 Feb       1     22.5 A             100       0
# 6 Site1     2015 Feb       1     23   B              20       1
# 7 Site1     2015 Feb       1     23   B              40       0
# 8 Site1     2015 Feb       1     23   B              60       0
# 9 Site1     2015 Feb       1     23   B              80       0
#10 Site1     2015 Feb       1     23   B             100       0
#11 Site1     2015 Feb       1     21.5 C             100       0
#12 Site1     2015 Feb       1     21.5 C              20       0
#13 Site1     2015 Feb       1     21.5 C              40       0
#14 Site1     2015 Feb       1     21.5 C              60       0
#15 Site1     2015 Feb       1     21.5 C              80       0
#16 Site1     2015 Feb       2     24   A              80       1
#17 Site1     2015 Feb       2     24   A              20       0
#18 Site1     2015 Feb       2     24   A              40       0
#19 Site1     2015 Feb       2     24   A              60       0
#20 Site1     2015 Feb       2     24   A             100       0

Вариант 2: использование tidyr::complete

library(tidyverse)
df %>%
    group_by_at(vars(Location:Transect)) %>%
    mutate(Distance = factor(Distance, levels = seq(20, 100, 20))) %>%
    complete(Distance, fill = list(Present = 0)) %>%
    mutate(Distance = as.integer(as.character(Distance)))
## A tibble: 20 x 8
## Groups:   Location, Year, Month, Visit, Air.Temp, Transect [4]
#   Location  Year Month Visit Air.Temp Transect Distance Present
#   <fct>    <int> <fct> <int>    <dbl> <fct>       <int>   <dbl>
# 1 Site1     2015 Feb       1     21.5 C              20       0
# 2 Site1     2015 Feb       1     21.5 C              40       0
# 3 Site1     2015 Feb       1     21.5 C              60       0
# 4 Site1     2015 Feb       1     21.5 C              80       0
# 5 Site1     2015 Feb       1     21.5 C             100       0
# 6 Site1     2015 Feb       1     22.5 A              20       1
# 7 Site1     2015 Feb       1     22.5 A              40       1
# 8 Site1     2015 Feb       1     22.5 A              60       0
# 9 Site1     2015 Feb       1     22.5 A              80       1
#10 Site1     2015 Feb       1     22.5 A             100       0
#11 Site1     2015 Feb       1     23   B              20       1
#12 Site1     2015 Feb       1     23   B              40       0
#13 Site1     2015 Feb       1     23   B              60       0
#14 Site1     2015 Feb       1     23   B              80       0
#15 Site1     2015 Feb       1     23   B             100       0
#16 Site1     2015 Feb       2     24   A              20       0
#17 Site1     2015 Feb       2     24   A              40       0
#18 Site1     2015 Feb       2     24   A              60       0
#19 Site1     2015 Feb       2     24   A              80       1
#20 Site1     2015 Feb       2     24   A             100       0

Недостаток варианта 2 заключается в том, что нам нужнопреобразовать Distance в factor и затем позже обратно в integer (или numeric).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...