2017-02-27 1 views
0

Unten passend ist die Zusammenfassung und die Struktur der beiden Datensätze Ich habe versucht claimants und unemp zu verschmelzen, sie können mich hier claims.csv gefunden und unemp.csvverschmelzen zwei Datenrahmen basierend auf Reihen von mehreren Spalten

> tbl_df(claimants) 
# A tibble: 6,960 × 5 
     X  County Month Year Claimants 
    <int>  <fctr> <fctr> <int>  <int> 
1  1  ALAMEDA Jan 2007  13034 
2  2  ALPINE Jan 2007  12 
3  3  AMADOR Jan 2007  487 
4  4  BUTTE Jan 2007  3496 
5  5 CALAVERAS Jan 2007  644 
6  6  COLUSA Jan 2007  1244 
7  7 CONTRA COSTA Jan 2007  8475 
8  8 DEL NORTE Jan 2007  328 
9  9 EL DORADO Jan 2007  2120 
10 10  FRESNO Jan 2007  19974 
# ... with 6,950 more rows 


> tbl_df(unemp) 
# A tibble: 6,960 × 7 
    County Year Month laborforce emplab unemp unemprate 
* <chr> <int> <chr>  <int> <int> <int>  <dbl> 
1 Alameda 2007 Jan  743100 708300 34800  4.7 
2 Alameda 2007 Feb  744800 711000 33800  4.5 
3 Alameda 2007 Mar  746600 713200 33300  4.5 
4 Alameda 2007 Apr  738200 705800 32400  4.4 
5 Alameda 2007 May  739100 707300 31800  4.3 
6 Alameda 2007 Jun  744900 709100 35800  4.8 
7 Alameda 2007 Jul  749600 710900 38700  5.2 
8 Alameda 2007 Aug  746700 709600 37000  5.0 
9 Alameda 2007 Sep  748200 712100 36000  4.8 
10 Alameda 2007 Oct  749000 713000 36100  4.8 
# ... with 6,950 more rows 

Ich dachte, zuerst sollte ich alle factor Spalten zu character Spalten ändern.

unemp[sapply(unemp, is.factor)] <- lapply(unemp[sapply(unemp, is.factor)], as.character) 

claimants[sapply(claimants, is.factor)] <- lapply(claimants[sapply(claimants, is.factor)], as.character) 

m <-merge(unemp, claimants, by = c("County", "Month", "Year")) 
dim(m) 
[1] 0 10 

In der Ausgabe von dim(m) sind 0 Zeilen in dem resultierenden Datenrahmen. Alle 6960 Zeilen sollten eindeutig übereinstimmen.

Um sicherzustellen, dass die beiden Datenrahmen einzigartige Kombination aus der die drei Säulen ‚Kreis‘ haben, ‚Monat‘ und ‚Jahr‘ ich neu anordnen und diese Spalten innerhalb der Datenrahmen neu anordnen, wie unten:

a <- claimants[ order(claimants[,"County"], claimants[,"Month"], claimants[,"Year"]), ] 

b <- unemp[ order(unemp[,"County"], unemp[,"Month"], unemp[,"Year"]), ] 

b[2:4] <- b[c(2,4,3)] 
a[2:4] %in% b[2:4] 
[1] TRUE TRUE TRUE 

Diese letzte Ausgabe bestätigt, dass alle Spalten "County", "Month" und "Year" in diesen beiden Datenfeldern übereinstimmen.

Ich habe versucht, Blick in die Dokumentation für merge und konnte nicht sammle, wo ich schief gehen, ich habe auch die inner_join Funktion von dplyr versucht:

> m <- inner_join(unemp[2:8], claimants[2:5]) 
Joining, by = c("County", "Year", "Month") 
> dim(m) 
[1] 0 8 

Ich bin etwas fehlt und weiß nicht, was , würde die Hilfe beim Verstehen dieses wissen, ich weiß, ich sollte die Zeilen nicht um die drei Spalten neu sortieren müssen, um zu laufen merge R sollte die übereinstimmenden Zeilen identifizieren und die nicht übereinstimmenden Spalten zusammenführen.

+2

ALAMEDA! = Alameda –

Antwort

1

Die Antragsteller df hat die Bezirke in Großbuchstaben, die Unemp df hat sie in Kleinbuchstaben.

Ich habe beim Einlesen Ihrer Daten die Optionen (stringsAsFactors = FALSE) verwendet. Ein paar Vorschläge lassen die X-Spalte in beiden fallen, es scheint nicht sinnvoll.

options(stringsAsFactors = FALSE) 
claims <- read.csv("claims.csv",header=TRUE) 
claims$X <- NULL 
unemp <- read.csv("unemp.csv",header=TRUE) 
unemp$X <- NULL 
unemp$County <- toupper(unemp$County) 

m <- inner_join(unemp, claims) 
dim(m) 

# [1] 6960 8 
Verwandte Themen