2017-10-06 1 views
1

kann nicht meinen Verstand um diese Aufgabe wickelnR: Match Zeichen Vektor mit einem anderen Charakter Vektor

mit 3 Spalten einen Datenrahmen „usa“ Betrachten „Titel“, „Stadt“ und „Zustand“ (reproduzierbar) :

title <- c("Events in Chicago, September", "California hotels", 
       "Los Angeles, August", "Restaurant in Chicago") 
    city <- c("","", "Los Angeles", "Chicago") 
    state <- c("","", "California", "IL") 

    usa <-data.frame(title, city, state) 

Resultierende in dieser:

       title  city  state 
    1 Events in Chicago, September      
    2   California hotels      
    3   Los Angeles, August Los Angeles California 
    4  Restaurant in Chicago  Chicago   IL 

nun, was ich versuche, die Zustandsgröße für die ersten 2 Beobachtungen zu tun ist, zu füllen, die jetzt fehlen.

TITLE-Variable enthält einen Hinweis: In jedem der Einträge wird entweder eine Stadt oder ein Bundesstaat erwähnt.

Ich muss folgendes tun:

  1. Überprüfen Sie, ob ein Wort in Spalte „Titel“ entspricht einer beliebigen Beobachtung in „Stadt“ und „Staat“ Spalten gefunden;
  2. Wenn ein Wort in "title" mit einer Beobachtung in "state" übereinstimmt, fügen Sie denselben Zustand für die Beobachtung des angegebenen Titels ein;
  3. Wenn ein Wort in "title" mit einer Beobachtung in "city" übereinstimmt, fügen Sie den Status der übereinstimmenden Stadt in die Spalte "state" der Titelzeile ein.

Also, was ich will schließlich bekommen, ist dies:

       title  city  state 
    1 Events in Chicago, September      IL 
    2   California hotels    California   
    3   Los Angeles, August Los Angeles California 
    4  Restaurant in Chicago  Chicago   IL 

Mit anderen Worten, in der zweiten Reihe der Titel ein Wort „California“ enthalten ist, so ein passender Zustand von dem Zustandsvektor gefunden wurde. In der ersten Zeile war jedoch das Wort "Chicago" der Schlüssel und es gab einen weiteren Eintrag im Datenrahmen (Zeile 4), der Chicago mit dem "IL" -Zustand verknüpfte, so dass "IL" in den ersten eingefügt werden musste Zeile der Spalte "Status".

Warten auf die Ideen der Gemeinde :) Danke!

Antwort

0

Ich würde Ihnen empfehlen, das stringr Paket zu verwenden; speziell eine Funktion namens str_extract.

Wenn Sie eine vollständige Liste der Städte haben, z. city <- c("Los Angeles", "Chicago"), dann können Sie es in reguläre Ausdrücke mit paste(city, collapse = '|' machen). Das gibt Ihnen: 'Los Angeles|Chicago'. Mit str_extract können Sie diese Stadt extrahieren (extrahiert die erste, die sie sieht, und eine NA, wenn keine angezeigt wird). Hier ist der vollständige Code. Hinweis: Dies funktioniert nur, wenn Sie Ihre Datenrahmen ein data_frame (tibble), kein data.frame (nicht ganz sicher, warum, nicht in sie sah)

library(tidyverse) 
library(stringr) 

title <- c("Events in Chicago, September", "California hotels", 
      "Los Angeles, August", "Restaurant in Chicago") 
city <- c("","", "Los Angeles", "Chicago") 
state <- c("","", "California", "IL") 

usa <-data_frame(title, city, state) # notice this is a data_frame not data.frame 

cities <- paste(c("Los Angeles", "Chicago"), collapse = '|') 
states <- paste(c("California", "IL"), collapse = '|') 

usa <- usa %>% 
    mutate(city = ifelse(city == '', str_extract(title, cities), city), 
     state = ifelse(state == '', str_extract(title, states), state)) 

Daraus ergibt sich:

# A tibble: 4 x 3 
         title  city  state 
         <chr>  <chr>  <chr> 
1 Events in Chicago, September  Chicago  <NA> 
2   California hotels  <NA> California 
3   Los Angeles, August Los Angeles California 
4  Restaurant in Chicago  Chicago   IL 
+0

danke für den Blick darauf! Ich brauche jedoch die Statuswerte für jede Zeile, das ist der Trick. Und in Zeile eins haben Sie NA für Zustand – Denis

+0

Nun, das ist eine einfache Lösung. Sie müssten nur eine Liste haben, die alle Städte in ihren Staaten abbildet. –

+0

Danke nochmal :) eine kurze Frage - die genannten Daten sind Teil eines größeren Datenrahmens. Soll ich die erforderlichen Daten für die Transformation in Teilmengen aufteilen, alle von Ihnen vorgeschlagenen Schritte ausführen und dann die Daten in den ursprünglichen Datenrahmen einfügen? – Denis

Verwandte Themen