2017-10-06 285 views
1

不能環繞這個任務我心裏R:與其他特徵向量匹配特徵向量

考慮一個數據幀「USA」 3列,「標題」,「城市」和「國家」(可重複) :

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) 

造成這種:

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

現在我所要做的是填補了狀態變量的第2個觀察值,這是現在下落不明。

TITLE變量包含一條線索:在每個條目中提及城市或州。

我需要做到以下幾點:

  1. 檢查是否在「標題」列中的任何字在「城市」和「國家」欄中發現的任何意見一致;
  2. 如果「標題」中的任何單詞與「狀態」中的任何觀察值相匹配,請將相同的狀態粘貼到給定標題的觀察值;
  3. 如果「標題」中的任何單詞與「城市」中的任何觀察值匹配,則將匹配的城市狀態粘貼到標題行的「狀態」列中。

所以我想最終是這樣的:

       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 

換句話說,第二行中的標題包含一個詞「加州」,所以匹配狀態從狀態向量中。然而,在第一行中,「芝加哥」這個詞是關鍵,數據框中還有另外一個條目(第4行),它將芝加哥與「IL」狀態聯繫起來,所以「IL」必須粘貼在第一行行「狀態」列。

等待社區的想法:)謝謝!

回答

0

我建議你使用stringr包;具體而言,稱爲str_extract的功能。

如果您有完整的城市列表,例如city <- c("Los Angeles", "Chicago"),那麼你可以使用paste(city, collapse = '|'將它變成正則表達式)。這會給你:'Los Angeles|Chicago'。與str_extract,你可以提取該城市(將提取它看到的第一個,如果沒有出現,將提取一個NA)。這是完整的代碼。 注:

# 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 
:如果你的數據幀是data_frame(tibble),而不是一個data.frame
(並不完全知道爲什麼,還沒有研究它)

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)) 

這導致這僅適用

+0

感謝您的關注!但是,我需要每行的狀態值,這就是訣竅。而在第一線,你有NA的狀態 – Denis

+0

那麼這是一個簡單的修復。你只需要有一張將所有城市映射到其狀態的列表。 –

+0

再次感謝:)一個簡單的問題 - 提到的數據是一個更大的數據框的一部分。我應該將所需的數據進行子集轉換,採取您提出的所有步驟,然後將數據粘貼到初始數據框中? – Denis