2016-12-30 5 views
1

Ich habe Datensätzedplyr Manipulation zeilenweise mutieren Gruppierung

x <- data.frame(Postcode = c(1, 2, 3, 4, 5, 6), 
       Latitude = c(3.1, 3.2, 3.3, 3.3, 3.4, 3.4), 
       Longitude = c(100, 101, 102, 102, 103, 104), 
       Exposure = c(1, 2, 3, 4, 5, 6)) 

Ich versuche, die Daten zu manipulieren innen x

wird
x <- data.frame(Postcode = c(1, 2, 3, 4, 5, 6), 
       Latitude = c(3.1, 3.2, 3.3, 3.3, 3.4, 3.4), 
       Longitude = c(100, 101, 102, 102, 103, 104), 
       Exposure = c(1, 2, 3, 4, 5, 6), 
       coords = c("3.1, 100", "3.2, 101", "3.3, 102", "3.3, 102", 
          "3.4, 103", "3.4, 104"), 
       postcode = c("1", "2", "3,4", "3,4", "5", "6"), 
       exposure = c(1, 2, 7, 7, 5, 6)) 

Die neue Spalte postcode die Postcode Paste zusammen, die die gleiche Latitude hat und Longitude. coords wird die Latitude und Longitude einfügen, während exposure die Exposure, coords summiert, d. H. Die gleiche Latitude und Longitude.

Ich kann dies erreichen, indem mit dplyr Paket und for Schleife

x <- mutate(x, coords = paste(Latitude, Longitude, sep = ", ")) 
x <- cbind(x, postcode = rep(0, nrow(x)), exposure = rep(0, nrow(x))) 
for(i in unique(x$coords)){ 
    x$postcode[x$coords == i] <- paste(x$Postcode[x$coords == i], collapse = ", ") 
    x$exposure[x$coords == i] <- sum(x$Exposure[x$coords == i]) 
} 

Wie kann ich dies erreichen, indem nur nur dplyr Paket verwenden, ohne for Schleife? oder vielleicht anderer Ansatz, die effizienter als die Verwendung von for Schleife ist, weil meine tatsächlichen Datensätze sind recht groß

+0

Der zweite Datensatz hat eine ungleiche Anzahl von Elementen. Bitte aktualisiere es – akrun

+0

@akrun Ich habe es bearbeitet. Danke für die Benachrichtigung –

+0

Es wird geschlossen, wenn Sie nicht beheben: Fehler in data.frame (Postleitzahl = c (0, 1, 2, 3, 4, 5, 6), Breitengrad = c (3.1,: Argumente bedeuten unterschiedliche Anzahl von Zeilen: 7, 6 – hrbrmstr

Antwort

1

Hier ist, wie Sie es mit dplyr tun können:

library(dplyr) 
x %>% 
    group_by(coords = paste(Latitude, Longitude, sep = ", ")) %>% 
    mutate(postcode = toString(Postcode), exposure = sum(Exposure)) 

# Source: local data frame [6 x 7] 
# Groups: coords [5] 
# 
# Postcode Latitude Longitude Exposure coords postcode exposure 
#  <dbl> <dbl>  <dbl> <dbl> <chr> <chr> <dbl> 
# 1  1  3.1  100  1 3.1, 100  1  1 
# 2  2  3.2  101  2 3.2, 101  2  2 
# 3  3  3.3  102  3 3.3, 102  3, 4  7 
# 4  4  3.3  102  4 3.3, 102  3, 4  7 
# 5  5  3.4  103  5 3.4, 103  5  5 
# 6  6  3.4  104  6 3.4, 104  6  6 
+0

Hallo, vielen Dank für Ihre Lösung.Meine Daten werden tatsächlich in einem SpatialPointsDataframe-Objekt gespeichert.Ich dachte, ich könnte es mit dieser Methode, ich einfach manipulieren stelle fest, dass ich group_by nicht für die Daten im spatialpointsDataframe-Objekt verwenden könnte.Ein Vorschlag? –

+0

Ich dachte, ich könnte zuerst die Daten aus dem sp-Objekt extrahieren und dann das dplyr anwenden, aber ich bemerkte, dass es das Objekt änderte, sodass ich es nicht speichern konnte es zurück zum sp Objekt –

+0

Wie auch immer, ich weiß nur, dass Sie group_by auf diese Weise verwenden könnten –

2
library(dplyr) 
library(tidyr) # unite() was used to join Lat, Lon 

x %>% unite(coords, Latitude, Longitude, sep = ",", remove = FALSE) %>% 
    group_by(coords) %>% mutate(exposure = sum(Postcode), postcode = toString(Postcode)) 
+0

Hallo, vielen Dank für Ihre Lösung. Meine Daten werden tatsächlich in einem spacepointsdataframe-Objekt gespeichert. Ich dachte, ich könnte es mit dieser Methode manipulieren, ich merke nur, dass ich group_by nicht zu den Daten im spatialpointsDataframe-Objekt verwenden konnte. Irgendein Vorschlag? –

+0

Ich dachte, ich könnte die Daten aus dem SP-Objekt zuerst extrahieren und dann die dplyr anwenden, aber ich bemerkte, dass es das Objekt geändert, so dass ich es nicht zurück auf das SP-Objekt speichern konnte –

+0

tatsächlich habe ich nicht viel gearbeitet 'SP' Objekte . Könntest du mre Details über hwat teilen, mit der du konfrontiert bist? –

1

Wir können dies tun, mit data.table

library(data.table) 
setDT(x)[, coords := paste(Latitude, Longitude, sep=",") 
    ][, c("exposure", "postcode") :=.(sum(Postcode), toString(Postcode)), coords] 
x 
# Postcode Latitude Longitude Exposure coords exposure postcode 
#1:  1  3.1  100  1 3.1,100  1  1 
#2:  2  3.2  101  2 3.2,101  2  2 
#3:  3  3.3  102  3 3.3,102  7  3, 4 
#4:  4  3.3  102  4 3.3,102  7  3, 4 
#5:  5  3.4  103  5 3.4,103  5  5 
#6:  6  3.4  104  6 3.4,104  6  6 
Verwandte Themen