2017-07-19 5 views
1

dieses Token-Datensatz vor:links auf Datumsbereich kommen von Gruppen-ID

Data = structure(list(txs = c(-50, -750, -35, -5.96, -61.5, -42.07, 
-142.4, -500, 132, -154.89, -109.51, -2000, -50, -40, -24.98, 
-15.6, -50, -147.72, -20, -6.6, -5, -20, -13.48, -7.25, -54.09, 
-200, -124.11, -30, -50, -30, 400, -10, -0.95, -4.1, -10000, 
30, -1.99, 74.03, -6.95, -2.96, -29, -403.6, -6, -6, 5250, -513.57, 
-300, -10, -500, -20, -6.45, -7.26, -40, -50, -13.14, 321.29, 
-18, 100, -5.5, -25, -59.2, -10.75, -3.2, 270, 65.8, -11.6, -104.78, 
-99.39, 0.1, -50, -80, -50, -371.44, -78, 270, -6.3, 40, -2.5, 
-29.99, -189.48, -400, -0.29, -20, -6.55, -987.37, -1400, -0.49, 
-20, -29.04, -65, -40, -27.5, -17.37, -10, -1092.84, -5.5, -69.93, 
-15.07, -400, -4.8), week = structure(c(1439157600, 1454281200, 
1471212000, 1445205600, 1448233200, 1451862000, 1449442800, 1453676400, 
1460325600, 1460930400, 1445205600, 1454281200, 1460930400, 1444600800, 
1462140000, 1471816800, 1443996000, 1448838000, 1479682800, 1453071600, 
1447023600, 1473631200, 1465768800, 1433109600, 1445205600, 1433714400, 
1466978400, 1441576800, 1459116000, 1451862000, 1436133600, 1440367200, 
1456095600, 1458514800, 1456700400, 1450047600, 1440972000, 1446418800, 
1465164000, 1441576800, 1442181600, 1453071600, 1461535200, 1460930400, 
1438552800, 1464559200, 1447628400, 1434924000, 1437343200, 1436738400, 
1443391200, 1438552800, 1440972000, 1446418800, 1446418800, 1453071600, 
1453071600, 1457305200, 1444600800, 1462140000, 1435528800, 1457305200, 
1437948000, 1440972000, 1437948000, 1433109600, 1461535200, 1453676400, 
1454886000, 1454281200, 1441576800, 1441576800, 1471212000, 1453071600, 
1451862000, 1442786400, 1443391200, 1439762400, 1436133600, 1461535200, 
1442181600, 1468188000, 1442181600, 1453676400, 1466373600, 1443391200, 
1450652400, 1454886000, 1439157600, 1441576800, 1463954400, 1442181600, 
1446418800, 1454886000, 1476050400, 1461535200, 1456700400, 1456700400, 
1435528800, 1456700400), class = c("POSIXct", "POSIXt"), tzone = ""), 
    num_c = c(1219, 1257, 1195, 33, 1105, 1223, 1257, 1317, 486, 
    1227, 477, 1039, 1238, 1008, 1137, 1294, 1070, 596, 1295, 
    1354, 1010, 1294, 1348, 1254, 19, 1185, 24, 1287, 1198, 955, 
    1324, 1293, 1343, 1162, 1272, 972, 972, 179, 1343, 1105, 
    1085, 1020, 947, 1375, 1005, 477, 596, 1198, 928, 1137, 1263, 
    1237, 1054, 1288, 1185, 1115, 1257, 1301, 1294, 1185, 1039, 
    957, 1131, 33, 477, 1258, 477, 1039, 1362, 1246, 596, 1010, 
    972, 1238, 477, 1296, 972, 1148, 1105, 24, 553, 1297, 1288, 
    1223, 789, 1298, 1082, 1353, 1030, 1287, 1203, 1008, 1294, 
    1227, 1298, 1203, 1346, 1010, 19, 1303)), .Names = c("txs", 
"week", "num_c"), row.names = c(NA, -100L), class = "data.frame") 

es hat drei Spalten:

  • nannte man num_c: Dies ist eine Kundennummer

  • man nennt week: das ist das Datum des Montag der Wochen, in denen num_c eine Bestellung aufgegeben hat.

  • one ‚txs‘ genannt: Gleichgewicht wegen pro Woche und Client (num_c)

Nun, für jeden Kunden würde ich diese Daten gesetzt, so zu verwenden, wie dplyr zu erweitern (zusammen), dass ich eine Reihe für jede Woche in dem Bereich von Daten, in denen dieser Kunde Bestellungen aufgegeben hat.

Darüber hinaus die neue leere Zellen (für TXS) sollte mit NA's gefüllt werden. Die Werte von TXS, die jenen Wochen/Clients entsprechen, die im ursprünglichen (nicht erweiterten) Datensatz vorhanden sind, sollten ihre ursprünglichen Werte beibehalten.

Ich habe versucht:

library(dplyr) 
stretch_Data = Data %>% 
       group_by(num_c) %>% 
       right_join(seq(min(week), max(week), by = 'week'), by = "week") 

Aber ich bekomme;

Error in seq(min(week), max(week), by = "week") : object 'week' not found 

was albern ist, weil Daten eine Woche Spalte enthält (vielen Dank).

Was mache ich falsch?

bearbeiten

Dank @ mt1022 für seine Lösung (Kommentar unten). Das ist leise schlau. Aber ein Problem bleibt: Ist es möglich, alle Spalten aus Daten zu integrieren? - Um meinen Punkt zu verdeutlichen, habe ich einen hinzugefügt: txs-- Dann sollten die fehlenden Werte (diejenigen, die Wochen ohne Kauf entsprechen) von NA's (wie in einem Joint) gefüllt werden. Die Zellen, die den Kunden * Wochendaten entsprechen, für die wir einen Kauf getätigt haben, sollten nur ihre ursprünglichen Werte beibehalten.

Im Wesentlichen tun na.omit() auf die neue (erweiterte Tabelle) sollte die ursprüngliche Tabelle zurückgeben; wie es auf einem Joint wäre;

+0

Der Fehler ist ziemlich offensichtlich.Es gibt keine Spalte "week" in 'seq (min (Woche), max (woche), by = 'woche')'. – mt1022

+0

Aber Daten enthält eine Spaltenwoche; Wie sagst du dplyr, um Woche von Daten zu ziehen? – user189035

+2

Die beiden zu verbindenden Datenrahmen sollten beide die Join-Spalte enthalten. Ich würde versuchen, etwas wie: 'Daten%>% group_by (num_c)%>% zusammenfassen (Woche = Liste (Seq (min (Woche), max (Woche), von = 'Woche')))%>% unnest (Woche) 'für Ihren Fall. – mt1022

Antwort

1

Verwenden der Lösung von @ mt1002 mit einer einfachen Addition, um die txs Spalte zu erhalten. Ich habe einen einzelnen Wert erhalten durch sum(txs), wo dies auch ein einzelner Wert der min(txs) oder max(txs) je nach Ihren Bedürfnissen sein könnte.

Data %>% group_by(num_c) %>% 
    summarise(week = list(seq(min(week), max(week), by = 'week')), 
      txs = sum(txs)) %>% 
    unnest(week) 

Nach der Klärung, das ist die Lösung, die ich mit aufkommen, wo es NA-Werte für Wochen gibt es keine Aufträge, zusätzlich zu der Anzahl der Aufträge pro Benutzer pro Woche. Sie können auch der Liste der Wochen mit Bestellungen von num_c mit einem Linksbündnis einschließlich der oben genannten Abfrage an die df beitreten.

library(lubridate) 
a <- data.frame(week = rep(seq(1,52,1))) 
Data %>% 
    group_by(num_c) %>% 
    mutate(week_num = week(week)) %>% 
    group_by(num_c, week_num) %>% 
    summarise(txs = sum(txs), 
      number_orders = n()) %>% 
    full_join(a, by = c("week_num"="week")) %>% 
    ungroup() %>% 
    arrange(week_num) 
+0

näher, aber noch nicht da. Schauen Sie sich die Wochen 2015-10-19 und 2015-06-29 an. Für diese Wochen, § num_c = 19, sollten die Werte von txs -54,09 und -400 sein (diese Wochen sind in den Daten für diesen Client). Aber Ihr Code gibt -454.09 für alle Wochen zurück (das Verhalten sollte stattdessen sein, NA für alle Wochen außer 2015-10-19 und 2015-06-29 zu setzen, die ihre korrekten ursprünglichen Werte haben sollten) – user189035

+0

Wäre es einfacher, a zu erstellen df aller Wochen innerhalb eines Jahres, dann füllen Sie diese df mit der Anzahl der Bestellungen pro Woche, und dann die Summe oder NA von txs pro Woche? Ich habe Lubridate oder ähnliches verwendet, um dies zu tun und hatte gute Ergebnisse. –

+0

ja, aber es sollte auf einer per num_c (Client) Basis erfolgen. Z.B. befüllen Sie dieses df mit der Anzahl der Bestellungen pro Woche * pro Kunde *. Wie der Datensatz in Ihrer Antwort müssen für q gegebene Clients keine Zeilen für die Woche außerhalb des Zeitbereichs von * diesem * Client erstellt werden (auch wenn der Bereich aller Clients viele Jahre umfasst). – user189035

Verwandte Themen