Вставка новых данных в таблицу

#r

Вопрос:

Я хотел бы немного помочь со следующим вопросом: обратите внимание, что этот код генерирует коэффициент с даты, которую я выбрал, в данном случае для дня 03/07 (dmda), он дал коэффициент, равный 15,55. В этом случае я хотел бы сгенерировать новую таблицу, в которой есть столбец с датами и другой столбец с коэффициентом, соответствующим этим датам. Для дат столбцов будут учитываться только даты date2 после дня, рассмотренного в date1 (28/06), в этом случае датами являются: 01/07, 02/07 и 03/07.

Таким образом, таблица будет выглядеть так:

введите описание изображения здесь

Спасибо!

 library(dplyr)
library(tidyverse)
library(lubridate)

df1 <- structure(
  list(date1 = c("2021-06-28","2021-06-28","2021-06-28","2021-06-28","2021-06-28",
                 "2021-06-28","2021-06-28","2021-06-28"),
       date2 = c("2021-04-02","2021-04-03","2021-04-08","2021-04-09","2021-04-10","2021-07-01","2021-07-02","2021-07-03"),
       Week= c("Friday","Saturday","Thursday","Friday","Saturday","Thursday","Friday","Monday"),
       DR01 = c(14,11,14,13,13,14,13,16), DR02= c(14,12,16,17,13,12,17,14),DR03= c(19,15,14,13,13,12,11,15),
       DR04 = c(15,14,13,13,16,12,11,19),DR05 = c(15,14,15,13,16,12,11,19),
       DR06 = c(21,14,13,13,15,16,17,18),DR07 = c(12,15,14,14,19,14,17,18)),
  class = "data.frame", row.names = c(NA, -8L))

dmda<-"2021-07-03"

datas<-df1 %>%
  filter(date2 == ymd(dmda)) %>%
  summarize(across(starts_with("DR"), sum)) %>%
  pivot_longer(everything(), names_pattern = "DR(. )", values_to = "val") %>%
  mutate(name = as.numeric(name))
colnames(datas)<-c("Days","Numbers")

mod <- nls(Numbers ~ b1*Days^2 b2,start = list(b1 = 47,b2 = 0), data = datas)
coef(mod)[2]
> coef(mod)[2]
      b2 
15.55011 
 

Ответ №1:

Мы можем subset использовать данные, в которых «дата 2» больше, чем «дата 1», получить столбец «дата 2», извлеченный в виде вектора. Зацикливайтесь на датах с map помощью (из purrr ), выполняйте преобразование внутри цикла, создавайте nls и coef извлекайте коэффициенты в a tibble и используйте _dfr для свертывания list в один tibble

 library(purrr)
library(dplyr)
dates <- subset(df1, date2 > date1, select = date2)$date2
map_dfr(dates, ~ {
 
   datas <- df1 %>%
  filter(date2 == ymd(.x)) %>%
  summarize(across(starts_with("DR"), sum)) %>%
  pivot_longer(everything(), names_pattern = "DR(. )", values_to = "val") %>%
  mutate(name = as.numeric(name))
colnames(datas)<-c("Days","Numbers")
mod <- nls(Numbers ~ b1*Days^2 b2,start = list(b1 = 47,b2 = 0), data = datas)
  tibble(dates = .x, coef = coef(mod)[2])
   }) %>%
   mutate(dates = format(ymd(dates), "%d/%m/%Y"))
# A tibble: 3 × 2
  dates       coef
  <chr>      <dbl>
1 01/07/2021  12.2
2 02/07/2021  12.4
3 03/07/2021  15.6
 

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

1. Акрун, спасибо, что ответил! Это более или менее так, но до того, как я не очень хорошо объяснил вопрос, я изменил конец вопроса для лучшего понимания. Я поместил выходную таблицу для вас, чтобы вы увидели, как она будет выглядеть.

2. @JSouza dmda<-"2021-07-03" Это выбрано из данных или просто случайно

3. Это последняя дата создания date2 df1 базы данных

4. @JSouza помогает ли вам обновление

5. @JSouza обновил сообщение