तो मेरे पास एक डेटाफ्रेम है जो इस तरह दिखता है:


datInput <- tibble(id = 1:2,
             c.0.opt = c("a,b", "c,d"),
             c.0.optI = c("1,2", "3,4"),
             c.0.sel = c("a", "c"),
             c.1.opt = c("e,f", "g,h"),
             c.1.optI = c("5,6", "7,8"),
             c.1.sel = c("e", "g"))

datInput
#     id c.0.opt c.0.optI c.0.sel c.1.opt c.1.optI c.1.sel
 
#1     1 a,b     1,2      a       e,f     5,6      e      
#2     2 c,d     3,4      c       g,h     7,8      g 



और मुझे इसे इस तरह दिखने की ज़रूरत है:


datOutput <- tibble(id = c(1,1,2,2),
                   c_opt = c("a,b", "e,f", "c,d", "g,h"),
                   c_optI = c("1,2", "5,6", "3,4", "7,8"),
                   c_sel = c("a", "e", "c", "g"))

#     id c_opt c_optI c_sel

#1     1 a,b   1,2    a    
#2     1 e,f   5,6    e    
#3     2 c,d   3,4    c    
#4     2 g,h   7,8    g 

मैं आमतौर पर इस तरह के कार्यों के लिए dplyr::pivot_longer का उपयोग करता हूं, लेकिन मुझे नहीं पता कि उन जटिल कॉलम नामों के साथ इसे कैसे किया जाए, क्या पंक्ति पहचानकर्ता बीच में है। क्या इसे करने का कोई तरीका है?

धन्यवाद

0
Gaborio 1 मई 2021, 01:15

3 जवाब

सबसे बढ़िया उत्तर
datInput %>% 
  gather(colname, val,-1 ) %>% 
  mutate(colname = gsub("\\.\\d\\.","_",colname)) %>% 
  pivot_wider(id_cols = id, names_from = colname, values_from = val, values_fn = list) %>% 
  unnest(cols = c(colnames(.)))

# A tibble: 4 x 4
     id c_opt c_optI c_sel
  <int> <chr> <chr>  <chr>
1     1 a,b   1,2    a    
2     1 e,f   5,6    e    
3     2 c,d   3,4    c    
4     2 g,h   7,8    g 
1
zimia 1 मई 2021, 01:32

हम pivot_longer के साथ-साथ names_sep का उपयोग रेगेक्स लुकअराउंड के रूप में . से मेल खाने वाले कॉलम नामों में कर सकते हैं जो एक अंक के बाद आते हैं

library(dplyr)
library(tidyr)
library(stringr)
pivot_longer(datInput, cols = -id, names_to = c("grp", ".value"), 
         names_sep = "(?<=\\d)\\.") %>%
    select(-grp) %>%
    rename_with(~ str_c('c_', .), -id)
 # A tibble: 4 x 4
 #   id c_opt c_optI c_sel
 #  <int> <chr> <chr>  <chr>
#1     1 a,b   1,2    a    
#2     1 e,f   5,6    e    
#3     2 c,d   3,4    c    
#4     2 g,h   7,8    g    
4
akrun 1 मई 2021, 03:09

मैंने ज़िमिया की टिप्पणियों के साथ अक्रुन के उत्तर को इस तरह संशोधित किया:

datOutput <- datInput %>% 
  pivot_longer(-id, names_to = "colname", values_to = "val") %>%
  mutate(colname = gsub("\\.\\d\\.","_",colname)) %>% 
  pivot_wider(id_cols = id, names_from = colname, values_from = val, values_fn = list) %>% 
  unnest(cols = c(colnames(.)))

यह पूरी तरह से काम करता है। आप दोनों को धन्यवाद।

0
Gaborio 3 मई 2021, 16:41