Suppression de colonnes individuelles en double et implantation dans R
Nov 23 2020
Voici un petit échantillon des colonnes:
df<-read.table (text=" Name1 id1 Nam2 id2 Name3 id3
'Hay, Gho' 1 'Nar,Sim' 2 'Tag,Kami' 19
'Ray, Com' 13 'Kam,Nao' 5 'Nar,kasi' 20
'Hay,Gho' 1 'Hal,Ghw' 4 'Nar,kasi' 20
'Bab,Sim' 11 'Hay,Gho' 3 'Kam,Nao' 24
'Tag,kami' 22 'Bab,Sim' 6 'Ray,com' 29
'Bab,sim' 11 'Nar,Sim' 2 'Tag,Kami' 19
", header=TRUE)
Je souhaite supprimer les doublons dans chaque colonne, puis les empiler pour obtenir le tableau suivant:
Name code Id
Hayo,Gho 1 id1
Ray,com 13 id1
Bab,Sim 11 id1
Tag,kim 22 id1
Nar,Sim 2 1d2
Kam,Nao 5 1d2
Hal,Ghw 4 1d2
Hay,Gho 3 1d2
Bab,Sim 6 id2
Tag,Kimi 19 id3
Nar,Kasi 20 id3
Kam,Nao 24 id3
Ray,com 19 id3
Réponses
1 Duck Nov 23 2020 at 22:13
Essayez cette approche. Il utilise une jointure après avoir remodelé les données par identifiant et nom. En outre, certaines tâches de nettoyage étaient nécessaires car les noms avaient des espaces et des minuscules et des majuscules. Voici le code utilisant dplyr
et tidyr
:
library(dplyr)
library(tidyr)
#Code
newdf <- df %>% dplyr::select(starts_with('Nam')) %>%
mutate(id=row_number()) %>%
pivot_longer(-id) %>%
rename(Name=value) %>%
group_by(id) %>%
mutate(Var=paste0('Var',row_number())) %>%
dplyr::select(-name) %>%
left_join(
df %>% dplyr::select(starts_with('id')) %>%
mutate(id=row_number()) %>%
pivot_longer(-id) %>%
rename(Id=name) %>%
group_by(id) %>%
mutate(Var=paste0('Var',row_number()))
) %>% ungroup() %>% dplyr::select(-c(id,Var)) %>%
arrange(Id) %>%
mutate(Val=toupper(gsub(" ", "", Name, fixed = TRUE))) %>%
group_by(Id) %>%
filter(!duplicated(Val)) %>% dplyr::select(-Val) %>%
mutate(Name=gsub(" ", "", Name, fixed = TRUE))
Production:
# A tibble: 13 x 3
# Groups: Id [3]
Name Id value
<chr> <chr> <int>
1 Hay,Gho id1 1
2 Ray,Com id1 13
3 Bab,Sim id1 11
4 Tag,kami id1 22
5 Nar,Sim id2 2
6 Kam,Nao id2 5
7 Hal,Ghw id2 4
8 Hay,Gho id2 3
9 Bab,Sim id2 6
10 Tag,Kami id3 19
11 Nar,kasi id3 20
12 Kam,Nao id3 24
13 Ray,com id3 29
akrun Nov 24 2020 at 05:03
Nous pouvons le faire avec pivot_longer
une manière plus compacte
library(dplyr)
library(tidyr)
pivot_longer(df, cols = everything(), names_to = c('.value', "Id"),
names_sep = "(?<=[a-z])(?=[0-9])") %>%
distinct
-production