व्यक्तिगत डुप्लिकेट कॉलमों को हटाकर उन्हें R में स्टेक करना

Nov 23 2020

स्तंभों का एक छोटा सा नमूना निम्नानुसार है:

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)

मैं प्रत्येक कॉलम के भीतर डुप्लिकेट को निकालना चाहता हूं और फिर उन्हें निम्न तालिका प्राप्त करने के लिए स्टैक करता हूं:

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

जवाब

1 Duck Nov 23 2020 at 22:13

इस दृष्टिकोण की कोशिश करो। यह आईडी और नाम द्वारा डेटा को पुनः साझा करने के बाद एक जॉइन का उपयोग करता है। इसके अलावा, कुछ सफाई कार्यों की आवश्यकता थी क्योंकि नामों में रिक्त स्थान और निचले, ऊपरी मामले थे। यहाँ कोड का उपयोग कर dplyrऔर 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))

आउटपुट:

# 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

हम इसे pivot_longerऔर अधिक कॉम्पैक्ट तरीके से कर सकते हैं

library(dplyr)
library(tidyr)
pivot_longer(df, cols = everything(), names_to = c('.value', "Id"), 
       names_sep = "(?<=[a-z])(?=[0-9])") %>%
  distinct

आउटपुट