Ich habe eine Tabelle mit 3 Spalten und ein paar tausend Datensätzen, Beispiel ist unten:
df1 <- data.frame(
ID = c('V1', 'V1', 'V1', 'V3', 'V3', 'V3', 'V4', 'V5','V5','V5'),
Category = c('a', 'a', 'a', 'a', 'b', 'b', 'a', 'b', 'c', 'c'),
Amount = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1))
Sie müssen mit sqldf abfragen, um die Daten nach ID und Kategorie zu gruppieren, dann den Betrag zu summieren und nur Zeilen zurückzugeben, wenn die ID mehr als eine Kategorie hat. Das Ergebnis würde wie folgt aussehen:
ID Category Amount_Sum
V3 a 1
V3 b 2
V5 b 1
V5 c 2
Ich habe den folgenden Code ausprobiert, der nicht wirklich funktioniert, und auch eine andere row_number über Partition, die irgendwie funktioniert, aber viel länger ist, als es viele zusätzliche Abfragen benötigt.
df2 <- sqldf::sqldf("
SELECT Count(*) [CNT]
[ID],
[Category],
SUM([Amount]) [amount]
FROM df1
GROUP BY [ID],
[Category]
Having Count(*) > 1")
Was ist der beste Weg, um diese Ausgabe mit sqldf in R zu erhalten? Vielen Dank!
Lösung des Problems
Sie könnten einen Join hinzufügen, der nur IDs mit mehr als einer Kategorie einschränkt:
SELECT t1.ID, t1.Category, t1.CNT
FROM
(
SELECT ID, Category, SUM(Amount) AS Amount_Sum
FROM df1
GROUP BY ID, Category
) t1
INNER JOIN
(
SELECT ID
FROM df1
GROUP BY ID
HAVING COUNT(DISTINCT Category) > 1
) t2
ON t2.ID = t1.ID;
Keine Kommentare:
Kommentar veröffentlichen