Как добавить набор значений в существующий фрейм данных? - PullRequest
1 голос
/ 11 апреля 2020

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

Пример:

df <- data.frame(ID=rep(c("CHC01", "CHC02", "CHC03"), each=4), 
                 year=rep(2015:2018, 3), 
                 growth=c(NA, 2.3, 2.1, 3.0, NA, NA, NA, 3.2, NA, NA, 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, 3.5), 
                       missing_years=c(1,3,2))

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

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

Есть ли у кого-нибудь есть идеи, как справиться с этой проблемой?

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

Ответы [ 2 ]

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

Базовый раствор R. Предположим, что таблицы "df" и "эстимейт" отсортированы по id (по возрастанию CH C), и мы сохраняем ваш "отсутствующий" объект, это должно работать:

df$growth=replace(df$growth,which(is.na(df$growth)),missing)

Вывод:

      ID year   growth
1  CHC01 2015 1.000000
2  CHC01 2016 2.300000
3  CHC01 2017 2.100000
4  CHC01 2018 3.000000
5  CHC02 2015 1.466667
6  CHC02 2016 1.466667
7  CHC02 2017 1.466667
8  CHC02 2018 3.200000
9  CHC03 2015 1.750000
10 CHC03 2016 1.750000
11 CHC03 2017 2.100000
12 CHC03 2018 1.200000
1 голос
/ 11 апреля 2020

Мы можем сделать соединение, а затем replace NA с вычисленным значением

library(dplyr)
df %>% 
   left_join(estimate) %>% 
   group_by(ID) %>% 
   transmute(year, growth  = replace(growth, is.na(growth), 
                 missing_length[1]/missing_years[1]))
# A tibble: 12 x 3
# Groups:   ID [3]
#   ID     year growth
#   <fct> <int>  <dbl>
# 1 CHC01  2015   1   
# 2 CHC01  2016   2.3 
# 3 CHC01  2017   2.1 
# 4 CHC01  2018   3   
# 5 CHC02  2015   1.47
# 6 CHC02  2016   1.47
# 7 CHC02  2017   1.47
# 8 CHC02  2018   3.2 
# 9 CHC03  2015   1.75
#10 CHC03  2016   1.75
#11 CHC03  2017   2.1 
#12 CHC03  2018   1.2 

Или с coalesce

df %>%
   mutate(growth = coalesce(growth,  with(estimate, 
        setNames(missing_length/missing_years, ID))[as.character(ID)])) %>%
   as_tibble
# A tibble: 12 x 3
#   ID     year growth
#   <fct> <int>  <dbl>
# 1 CHC01  2015   1   
# 2 CHC01  2016   2.3 
# 3 CHC01  2017   2.1 
# 4 CHC01  2018   3   
# 5 CHC02  2015   1.47
# 6 CHC02  2016   1.47
# 7 CHC02  2017   1.47
# 8 CHC02  2018   3.2 
# 9 CHC03  2015   1.75
#10 CHC03  2016   1.75
#11 CHC03  2017   2.1 
#12 CHC03  2018   1.2 

или подобным вариантом в data.table

library(data.table)
setDT(df)[estimate, growth := fcoalesce(growth, 
           missing_length/missing_years), on = .(ID)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...