2017-06-30 6 views
1

Ich habe Probleme beim Splitting Spalten in meinem Datenrahmen:Spalten in einem Datenrahmen aufteilen?

2010 census 2014 land area   city 
8175133  302.6 sq mi 783.8 km2  New york 
3792621  468.7 sq mi 1213.9 km2 Los Angeles 
2695598  227.7 sq mi 589.6 km2  Chicago 

I erhalten möge:

2010 census area sq/mi  area sq/km   city 
8175133  302.6   783.8    New york 
3792621  468.7   1213.9    Los Angeles 
2695598  227.7   589.6    Chicago 
+0

Bitte Lesen Sie [Wie man ein großes reproduzierbares Beispiel in R macht?] (https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). – Masoud

+0

* "Ich habe Probleme" * ... welche Schwierigkeiten? Wenn Sie den Code, den Sie ausprobiert haben, und die Fehler oder Ausgaben, die Sie erhalten, anzeigen, hilft das. (Bitte lesen Sie den Link Masoud zur Verfügung, es ist sehr hilfreich und wird die Wahrscheinlichkeit erhöhen, eine Antwort zu bekommen, früher.) – r2evans

+0

eine andere Basis R: 'mit (df, cbind (df, do.call (rbind, regmatches (Land.area , gregexpr ("[0-9] + \\. * [0-9] +", land.area))))) ' – user20650

Antwort

1

Hier ist eine tidyr Lösung.

library(tidyr) 

df <- data.frame(census = c(8175133, 3792621, 2695598), 
       land.area = c("302.6 sq mi 783.8 km2", "468.7 sq mi 1213.9 km2", "227.7 sq mi 589.6 km2"), 
       city = c("New york","Los Angeles","Chicago"), stringsAsFactors = FALSE) 

df$land.area <- sapply(df$land.area, sub, pattern = " km2", replacement = "") 

df <- df %>% separate(col = land.area, into = c("area sq/mi", "area sq/km"), sep = " sq mi ") 
1

können Sie stringr::str_split_fixed verwenden:

library(stringr) 
splitted <- str_split_fixed(dt$X2014.land.area, " sq mi ", 2) 

splitted[,2] <- gsub(" km2", "", as.character(splitted[,2])) 

colnames(splitted) <- c("area sq. mi", "area sq km") 

splitted <- data.frame(splitted) 


dt.2 <- cbind(dt[,c(1,3)], splitted) 

dt.2 

# X2010.census  city area.sq..mi area.sq.km 
# 1  8175133 New york  302.6  783.8 
# 2  3792621 Los Angeles  468.7  1213.9 
# 3  2695598  Chicago  227.7  589.6 

Daten

structure(list(X2010.census = c(8175133L, 3792621L, 2695598L), 
    X2014.land.area = c("302.6 sq mi 783.8 km2", "468.7 sq mi 1213.9 km2", 
    "227.7 sq mi 589.6 km2"), city = c("New york", "Los Angeles", 
    "Chicago")), .Names = c("X2010.census", "X2014.land.area", 
    "city"), row.names = c(NA, -3L), class = "data.frame") -> dt 
0

Hier ist eine Lösung Basis R sub

dt$Area_SqMi = sub("\\s*sq\\s*mi.*", "", dt$X2014.land.area) 
dt$Area_km2 = sub(".*mi\\s+(\\S+)\\s+km2.*", "\\1", dt$X2014.land.area) 

dt 
    X2010.census  X2014.land.area  city Area_SqMi Area_km2 
1  8175133 302.6 sq mi 783.8 km2 New york  302.6 783.8 
2  3792621 468.7 sq mi 1213.9 km2 Los Angeles  468.7 1213.9 
3  2695598 227.7 sq mi 589.6 km2  Chicago  227.7 589.6 

Natürlich verwenden, wenn Sie von der ursprünglichen Spalte loswerden möchten, können Sie dt = dt[,-2]

0

Mit data.table und die tstrsplit Funktion hinzufügen aus diesem Paket:

dat <- fread("2010 census, 2014 land area, city 
       8175133, 302.6 sq mi 783.8 km2, New york 
       3792621, 468.7 sq mi 1213.9 km2, Los Angeles 
       2695598, 227.7 sq mi 589.6 km2, Chicago") 
dat[, c("area sq/mi", "area sq/km") := tstrsplit(`2014 land area`, " ", keep = c(1,4))] 
dat[, .(`2010 census`, `area sq/mi`, `area sq/km`, city)] 

# 2010 census area sq/mi area sq/km  city 
# 1:  8175133  302.6  783.8 New york 
# 2:  3792621  468.7  1213.9 Los Angeles 
# 3:  2695598  227.7  589.6  Chicago 
Verwandte Themen