удаление похожих названий стран в каждой строке в r

#r #duplicates

#r #дубликаты

Вопрос:

У меня есть набор данных с образцом столбца из него, показанным ниже.

Мне нужно удалить похожие названия стран в каждой строке (ОСНОВНОЙ ЗАПРОС)

затем мне нужно создать столбец для каждой страны (ДОПОЛНИТЕЛЬНЫЙ ЗАПРОС).

 data<-read.table(text="
LocationCountry
United States, Belgium, France, Ireland, Netherlands, Netherlands, Netherlands, Sweden
Spain, Spain, Spain, Spain
Korea, Republic of
Korea, Republic of
Austria, Austria, Austria
United States, United States, United States, United States, United States, United States
Italy, Italy
Korea, Republic of, Korea, Republic of, Korea, Republic of, Korea, Republic of, Korea, Republic of, Korea, Republic of, Korea, Republic of, Korea, Republic of
India, Iran, Islamic Republic of
Spain, Spain, Spain, Spain
Korea, Republic of
Turkey, Turkey", header=T, sep="n")
 

Любые советы будут с благодарностью

Комментарии:

1. Первая часть очень проста. Вторая часть сбивает с толку. Вы имеете в виду создание столбца для каждой страны в другом фрейме данных?

2. @Amit Спасибо. Мне это нужно в том же наборе данных, если это возможно. В противном случае у меня есть серийный номер для каждой строки в моем большом наборе данных, чтобы я мог объединить, если это необходимо.

3. Некоторые страны имеют , промежуточные значения, т.е. Korea, Republic of

Ответ №1:

In base R мы можем использовать strsplit для разделения на a list , получения unique элементов и paste их возврата

 data$LocationCountry <- sapply(strsplit(data$LocationCountry, ",\s*"), 
       function(x) toString(unique(x)))
 

-вывод

 data
#                                                LocationCountry
#1  United States, Belgium, France, Ireland, Netherlands, Sweden
#2                                                         Spain
#3                                            Korea, Republic of
#4                                            Korea, Republic of
#5                                                       Austria
#6                                                 United States
#7                                                         Italy
#8                                            Korea, Republic of
#9                              India, Iran, Islamic Republic of
#10                                                        Spain
#11                                           Korea, Republic of
#12                                                       Turkey
 

Для дополнительной части, если нам нужно создать двоичные столбцы для каждого элемента в ‘LocationCountry’, затем используйте обновленный столбец ‘LocationCountry’ с уникальными именами, разделите его и примените mtabulate

 library(qdapTools)
cbind(data, mtabulate(strsplit(data$LocationCountry, ",\s ")))
 

-вывод

                                              LocationCountry Austria Belgium France India Iran Ireland Islamic Republic of Italy
1  United States, Belgium, France, Ireland, Netherlands, Sweden       0       1      1     0    0       1                   0     0
2                                                         Spain       0       0      0     0    0       0                   0     0
3                                            Korea, Republic of       0       0      0     0    0       0                   0     0
4                                            Korea, Republic of       0       0      0     0    0       0                   0     0
5                                                       Austria       1       0      0     0    0       0                   0     0
6                                                 United States       0       0      0     0    0       0                   0     0
7                                                         Italy       0       0      0     0    0       0                   0     1
8                                            Korea, Republic of       0       0      0     0    0       0                   0     0
9                              India, Iran, Islamic Republic of       0       0      0     1    1       0                   1     0
10                                                        Spain       0       0      0     0    0       0                   0     0
11                                           Korea, Republic of       0       0      0     0    0       0                   0     0
12                                                       Turkey       0       0      0     0    0       0                   0     0
   Korea Netherlands Republic of Spain Sweden Turkey United States
1      0           1           0     0      1      0             1
2      0           0           0     1      0      0             0
3      1           0           1     0      0      0             0
4      1           0           1     0      0      0             0
5      0           0           0     0      0      0             0
6      0           0           0     0      0      0             1
7      0           0           0     0      0      0             0
8      1           0           1     0      0      0             0
9      0           0           0     0      0      0             0
10     0           0           0     1      0      0             0
11     1           0           1     0      0      0             0
12     0           0           0     0      0      1             0
 

Комментарии:

1. Спасибо за ваши отзывы. Я пробовал, но это дает мне это Error in strsplit(data$LocationCountry, ",\s*") : non-character argument . Кроме того, можно ли помочь с дополнительным запросом выше, если это возможно? Голос за

2. @MohamedRahouma Хорошо, причина в том, что у вас есть factor столбец. Преобразование в character , т.е. sapply(strsplit(as.character(data$LocationCountry), ",\s*"), function(x) toString(unique(x))) Из R 4.0, stringsAsFactors = FALSE по умолчанию. Возможно, у вас старая версия R.

3. Да, теперь это работает. У меня есть R version 3.6.2 . Возможно ли помочь с дополнительным вопросом?. Против.

4. @MohamedRahouma не могли бы вы попробовать обновленное решение

5. Это работает. С благодарностью и принято в качестве решения. и проголосовал против.

Ответ №2:

Вы можете попробовать это:

 library(dplyr)
library(tidyr)
#Code1
data %>%
  mutate(id=row_number()) %>%
  separate_rows(LocationCountry,sep=',') %>%
  mutate(LocationCountry=trimws(LocationCountry)) %>%
  group_by(id) %>%
  filter(!duplicated(LocationCountry)) %>%
  summarise(LocationCountry=paste0(LocationCountry,collapse = ', ')) %>%
  select(-id)
 

Вывод:

 # A tibble: 12 x 1
   LocationCountry                                             
   <chr>                                                       
 1 United States, Belgium, France, Ireland, Netherlands, Sweden
 2 Spain                                                       
 3 Korea, Republic of                                          
 4 Korea, Republic of                                          
 5 Austria                                                     
 6 United States                                               
 7 Italy                                                       
 8 Korea, Republic of                                          
 9 India, Iran, Islamic Republic of                            
10 Spain                                                       
11 Korea, Republic of                                          
12 Turkey                                                      
 

Ответ №3:

Хорошо, вопрос, поднятый @akrun, усложняет то, что между некоторыми странами есть запятая. Однако вот мое решение. Не сильно отличается от @akrun .

 RemoveRedundants <- function(Row){
  Split_Countries <- unlist(strsplit(Row, ", "))
  Unique_Countries <- paste(unique(Split_Countries, fromLast = TRUE), collapse = ", ")
  return(Unique_Countries)
}

data$UniqueCountries <- apply(data,1,RemoveRedundants)
View(data)
 

В качестве выходных данных выдает следующее
введите описание изображения здесь

Комментарии:

1. Большое спасибо за ваш ценный вклад в ваш код data$UniqueCountries <- apply(data,1,RemoveRedundants) , есть ли какой-либо способ использовать имя столбца, а не 1 поскольку этот столбец не является номером 1. Кроме того, можно ли помочь в дополнительном запросе выше. Против.

2. 1 — это поле. Если это 1, это означает, что вы хотите применить функцию для каждой строки. если это 2, то вы хотите применить для каждого столбца. Я предполагаю, что вам нужно по дополнительному запросу.. Для каждой уникальной страны вам нужен столбец, чтобы каждая ячейка каждого из этих новых столбцов позже заполнялась какой-то логикой позже? верно?

3. Спасибо большое. Да, мне нужен, например, столбец с именем India с1, если в строке есть India, и 0, если в нем нет, и т.д. для других стран.