Как добавить значения в столбец и сохранить некоторые NA? - PullRequest
2 голосов
/ 11 апреля 2020

У меня есть фрейм данных, содержащий три столбца: ID, год, рост . Последний содержит данные о росте в миллиметрах за каждый год.

Пример:

df <- data.frame(ID=rep(c("CHC01", "CHC02", "CHC03"), each=6), 
         year=rep(2013:2018, 3), 
         growth=c(NA, NA, NA, 2.3, 2.1, 3.0, NA, NA, NA, NA, 1.1, 4.8, 1.0, 3.2, 4.2, 2.3, 2.1, 1.2))

В другом кадре данных у меня есть три других столбца: ID, missing_length, missing_years . Недостающая длина относится к расчетной длине, пропущенной в измерениях. Пропущенные годы относятся к числу пропущенных лет в df

estimate <- data.frame(ID=c("CHC01", "CHC02", "CHC03"), 
               missing_length=c(1.0, 4.4, 0), 
               missing_years=c(1,3,0))

Для расчета роста для каждого пропущенного года я попытался:

missing <- rep(estimate$missing_length / estimate$missing_years, estimate$missing_years)

Это важно отметить, что не все NA с df будут заменены оценочными значениями.

Вот пример фрейма данных, который я пытаюсь получить:

    ID   year growth
1  CHC01 2013     NA
2  CHC01 2014     NA
3  CHC01 2015   1.00
4  CHC01 2016   2.30
5  CHC01 2017   2.10
6  CHC01 2018   3.00
7  CHC02 2013     NA
8  CHC02 2014   1.47
9  CHC02 2015   1.47
10 CHC02 2016   1.47
11 CHC02 2017   1.10
12 CHC02 2018   4.80
13 CHC03 2013   1.00
14 CHC03 2014   3.20
15 CHC03 2015   4.20
16 CHC03 2016   2.30
17 CHC03 2017   2.10
18 CHC03 2018   1.20

Кто-нибудь знает, как решить эту проблему?

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

1 Ответ

1 голос
/ 12 апреля 2020

Мы можем использовать which, чтобы получить индекс позиции, а затем поднастроить эту позицию с tail с missing_years в replace, чтобы заменить эти пропущенные значения соотношением «missing_length» и «missing_years» после выполнения left_join с оценкой

library(dplyr)
df %>%
    left_join(estimate) %>%
    group_by(ID) %>% 
    transmute(year, growth = replace(growth, 
          tail(which(is.na(growth)), first(missing_years)), 
              first(missing_length)/first(missing_years)))
# A tibble: 18 x 3
# Groups:   ID [3]
#   ID     year growth
#   <fct> <int>  <dbl>
# 1 CHC01  2013  NA   
# 2 CHC01  2014  NA   
# 3 CHC01  2015   1   
# 4 CHC01  2016   2.3 
# 5 CHC01  2017   2.1 
# 6 CHC01  2018   3   
# 7 CHC02  2013  NA   
# 8 CHC02  2014   1.47
# 9 CHC02  2015   1.47
#10 CHC02  2016   1.47
#11 CHC02  2017   1.1 
#12 CHC02  2018   4.8 
#13 CHC03  2013   1   
#14 CHC03  2014   3.2 
#15 CHC03  2015   4.2 
#16 CHC03  2016   2.3 
#17 CHC03  2017   2.1 
#18 CHC03  2018   1.2 
...