Как я могу сгруппировать по дате и сохранить для вывода цикла в новую переменную? - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь перебрать CSV-файл, в котором указаны first.name (идентификаторы) каждого человека и дата, когда каждый из них выполнил задание.Прежде чем анализировать задачи, я пытаюсь сгруппировать каждую дату по недельной величине (неделя 1 - день 1: 7 на человека, неделя 2,3 и т. Д.). Каждый человек начал с другой даты и длится в среднем 30-40 дней.(некоторые с пропущенными днями между ними).Мне нужно, чтобы недели начинались с уникальной первой даты данных каждого человека до даты окончания.

Мои необработанные данные выглядят так:

  ï..first.name Last.Name User.ID       Date
1          5006    'G103'   23412 2018-05-07  
2          5006    'G103'   23412 2018-05-08   
3          5006    'G103'   23412 2018-05-09  
4          5007    'G104'   23413 2018-05-07
5          5007    'G104'   23413 2018-05-10  
6          5006    'G103'   23412 2018-05-15   
7          5008    'G105'   23414 2018-05-07  
8          5007    'G104'   23413 2018-05-19

Мой код:

outputWeek = matrix()  #empty matrix

for(x in 1:length(unique(Raw_whoop$ï..first.name))){ #1 through each unique ID
  whoopName = as.character(unique(Raw_whoop$ï..first.name)[x]) #get ID name
  dvec = as.Date(Raw_whoop$Date[Raw_whoop$ï..first.name == whoopName]) #get dates associated with that name
  dweek = as.numeric(dvec-dvec[1]) %/% 7 # group those dates into weeks

  outputWeek[x] = dweek #store the dates in new variable that I can later append to the csv file as a new column. **but this doesn't work**

все работает, кроме моей последней строки, когда я пытаюсь устранить неполадки.Я попробовал c / rbind вместо [x] и продолжаю получать различные ошибки.

Я бы хотел, чтобы мой вывод выглядел примерно так:

 ï..first.name Last.Name User.ID       Date  Week #
1          5006    'G103'   23412 2018-05-07  0 
2          5006    'G103'   23412 2018-05-08  0  
3          5006    'G103'   23412 2018-05-09  0
4          5007    'G104'   23413 2018-05-07  0
5          5007    'G104'   23413 2018-05-10  0
6          5006    'G103'   23412 2018-05-15  1 
7          5008    'G105'   23414 2018-05-07  0
8          5007    'G104'   23413 2018-05-19  1

В идеале я мог бы просто иметь новую переменную "week #" в одном столбце, а затем добавлять / вставлять значения рядом сФайл CSV при сортировке по идентификатору.

Спасибо

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Нет необходимости в петле for;это простой случай целочисленного деления с использованием %/%

library(dplyr)
df %>%
    group_by(User.ID) %>%
    mutate(week_no = as.integer(as.Date(Date) - first(as.Date(Date))) %/% 7) %>%
    ungroup()
## A tibble: 8 x 5
#  ï..first.name Last.Name User.ID Date       week_no
#          <int> <fct>       <int> <fct>        <dbl>
#1          5006 G103        23412 2018-05-07       0
#2          5006 G103        23412 2018-05-08       0
#3          5006 G103        23412 2018-05-09       0
#4          5007 G104        23413 2018-05-07       0
#5          5007 G104        23413 2018-05-10       0
#6          5006 G103        23412 2018-05-15       1
#7          5008 G105        23414 2018-05-07       0
#8          5007 G104        23413 2018-05-19       1

Пример данных

df <- read.table(text =
    "  ï..first.name Last.Name User.ID       Date
1          5006    'G103'   23412 2018-05-07
2          5006    'G103'   23412 2018-05-08
3          5006    'G103'   23412 2018-05-09
4          5007    'G104'   23413 2018-05-07
5          5007    'G104'   23413 2018-05-10
6          5006    'G103'   23412 2018-05-15
7          5008    'G105'   23414 2018-05-07
8          5007    'G104'   23413 2018-05-19", header = T)
0 голосов
/ 05 марта 2019

Я только что обнаружил, что могу «решить» это, назначив переменную outputWeek перед циклом for в список вместо матрицы.Однако я не уверен, что этот метод является наиболее эффективным, поэтому любая помощь приветствуется.

...