#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, если в нем нет, и т.д. для других стран.