Как я могу разделить слова в длинной строке в соответствии со списком значений, чтобы создать новый фрейм данных в R? - PullRequest
1 голос
/ 03 марта 2020

У меня есть следующее строковое значение: "Y AFGHANISTAN Y ALBANIA A ALGERIA Y ANDORRA A ANGOLA Y ANTIGUA AND BARBUDA Y ARGENTINA Y ARMENIA Y AUSTRALIA A AUSTRIA Y AZERBAIJAN Y BAHAMAS Y BAHRAIN Y BANGLADESH Y BARBADOS Y BELARUS Y BELGIUM Y BELIZE Y BENIN Y BHUTAN"

И у меня есть список стран:

[1] "AFGHANISTAN"                              
  [2] "ALBANIA"                                  
  [3] "ALGERIA"                                  
  [4] "ANDORRA"                                  
  [5] "ANGOLA"                                   
  [6] "ANTIGUA AND BARBUDA"                      
  [7] "ARGENTINA"                                
  [8] "ARMENIA"                                  
  [9] "AUSTRALIA"                                
 [10] "AUSTRIA"                                  
 [11] "AZERBAIJAN"                               
 [12] "BAHAMAS"                                  
 [13] "BAHRAIN"                                  
 [14] "BANGLADESH"                               
 [15] "BARBADOS"                                 
 [16] "BELARUS"                                  
 [17] "BELGIUM"                                  
 [18] "BELIZE"                                   
 [19] "BENIN"                                    
 [20] "BHUTAN" 

Я хотел бы разбить строку на каждое из значений в список стран, так что мой результирующий фрейм данных выглядит так:

Vote Country
Y    Afghanistan
Y    Albania
A    Algeria
Y    ANDORRA 
A    ANGOLA 
Y    ANTIGUA AND BARBUDA 
Y    ARGENTINA 
Y    ARMENIA 
Y    AUSTRALIA 
A    AUSTRIA 
Y    AZERBAIJAN 
Y    BAHAMAS 
Y    BAHRAIN 
Y    BANGLADESH 
Y    BARBADOS 
Y    BELARUS 
Y    BELGIUM 
Y    BELIZE 
Y    BENIN 
Y    BHUTAN

Любая помощь будет высоко ценится!

Ответы [ 2 ]

2 голосов
/ 03 марта 2020

Вы можете разбить строку на «Y» или «A» и создать из нее двухбалочный фрейм данных.

data.frame(matrix(trimws(strsplit(string, "(?=\\bY\\b|\\bA\\b)", perl = TRUE)[[1]]),
           ncol = 2, byrow = TRUE))

#   X1                  X2
#1   Y         AFGHANISTAN
#2   Y             ALBANIA
#3   A             ALGERIA
#4   Y             ANDORRA
#5   A              ANGOLA
#6   Y ANTIGUA AND BARBUDA
#7   Y           ARGENTINA
#8   Y             ARMENIA
#9   Y           AUSTRALIA
#10  A             AUSTRIA
#11  Y          AZERBAIJAN
#12  Y             BAHAMAS
#13  Y             BAHRAIN
#14  Y          BANGLADESH
#15  Y            BARBADOS
#16  Y             BELARUS
#17  Y             BELGIUM
#18  Y              BELIZE
#19  Y               BENIN
#20  Y              BHUTAN

данные

string <- "Y AFGHANISTAN Y ALBANIA A ALGERIA Y ANDORRA A ANGOLA Y ANTIGUA AND BARBUDA Y ARGENTINA Y ARMENIA Y AUSTRALIA A AUSTRIA Y AZERBAIJAN Y BAHAMAS Y BAHRAIN Y BANGLADESH Y BARBADOS Y BELARUS Y BELGIUM Y BELIZE Y BENIN Y BHUTAN"
0 голосов
/ 03 марта 2020

Если вы хотите использовать список стран, вы можете создать из него строку поиска, а затем разбить строку по названию этих стран.

Редактировать : Дополнительные изменения сделаны на основе на комментарий.

Во-первых, в списке стран в скобках не указывается. Например: Боливия (многонациональное государство).

Кроме того, расщепление происходит только на целые слова (с пробелом после), так что DOMINICA не извлекается из DOMINICAN REPUBLI C.

Могут потребоваться другие (или лучшие) модификации регулярных выражений в зависимости от имеющегося списка. Я надеюсь, что это полезно.

library(stringr)
library(stringi)

esc_countries <- stri_replace_all_fixed(countries, pattern = c("(", ")"), replacement = c("\\(", "\\)"), vectorize_all = FALSE)
searchStr <- paste0(esc_countries, collapse = "(\\s)|")
result <- as.data.frame(str_split_fixed(trimws(unlist(strsplit(string, paste0("(?<=",searchStr,")"), perl = T))), " ", 2))
colnames(result) <- c("Vote", "Country")

Вывод

   Vote                          Country
1     Y                      AFGHANISTAN
2     Y                          ALBANIA
3     A                          ALGERIA
4     Y                          ANDORRA
5     A                           ANGOLA
6     Y              ANTIGUA AND BARBUDA
7     Y                        ARGENTINA
8     Y                          ARMENIA
9     Y                        AUSTRALIA
10    A                          AUSTRIA
11    Y                       AZERBAIJAN
12    Y                          BAHAMAS
13    Y                          BAHRAIN
14    Y                       BANGLADESH
15    Y                         BARBADOS
16    Y                          BELARUS
17    Y                          BELGIUM
18    Y                           BELIZE
19    Y                            BENIN
20    Y                           BHUTAN
21    Y                            CONGO
22    Y BOLIVIA (PLURINATIONAL STATE OF)
23    Y                         DOMINICA
24    Y               DOMINICAN REPUBLIC
25    Y                         ZANZIBAR  

Данные

(from @Ronak Shah)

string <- "Y AFGHANISTAN Y ALBANIA A ALGERIA Y ANDORRA A ANGOLA Y ANTIGUA AND BARBUDA Y ARGENTINA Y ARMENIA Y AUSTRALIA A AUSTRIA Y AZERBAIJAN Y BAHAMAS Y BAHRAIN Y BANGLADESH Y BARBADOS Y BELARUS Y BELGIUM Y BELIZE Y BENIN Y BHUTAN Y CONGO Y BOLIVIA (PLURINATIONAL STATE OF) Y DOMINICA Y DOMINICAN REPUBLIC Y ZANZIBAR"

countries <- c(
  "AFGHANISTAN",                              
  "ALBANIA",                                  
  "ALGERIA",                                  
  "ANDORRA",                                  
  "ANGOLA",                                   
  "ANTIGUA AND BARBUDA",                      
  "ARGENTINA",                                
  "ARMENIA",                                  
  "AUSTRALIA",                                
  "AUSTRIA",                                  
  "AZERBAIJAN",                               
  "BAHAMAS",                                  
  "BAHRAIN",                                  
  "BANGLADESH",                               
  "BARBADOS",                                 
  "BELARUS",                                  
  "BELGIUM",                                  
  "BELIZE",                                   
  "BENIN",                                    
  "BHUTAN",
  "CONGO",
  "BOLIVIA (PLURINATIONAL STATE OF)",
  "DOMINICA",
  "DOMINICAN REPUBLIC",
  "ZANZIBAR") 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...