गैर-अद्वितीय वस्तुओं (यहां, नाम) के कॉलम के साथ एक तालिका को देखते हुए और दो और कॉलम: एक लेबल (समूह) के साथ जो केवल पहले कॉलम के समूह के भीतर अद्वितीय हैं, और तीसरा जिसमें मान (विलंब) हैं, I' मैं नाम और समूह के लिए कॉलम वाली तालिका के साथ समाप्त करने की कोशिश कर रहा हूं, और अगले-उच्चतम विलंब मान के समूह के साथ एक तीसरा कॉलम। यदि कोई अगला-उच्चतम नहीं है, तो कोई पंक्ति नहीं है।

तो एक डेटासेट के लिए जैसे:

df = data.frame(
  Name =    c('lorem', 'lorem', 'lorem', 'lorem', 'lorem', 'ipsum', 'ipsum', 'ipsum', 'ipsum', 'ipsum', 'dolor', 'dolor', 'dolor', 'dolor', 'dolor', 'dolor', 'amet', 'amet', 'amet', 'amet', 'amet', 'amet'), 
  Group =   c('E', 'D', 'C', 'B', 'A', 'E', 'D', 'C', 'B', 'A', 'C', 'A', 'B', 'D', 'F', 'E', 'C', 'A', 'B', 'D', 'F', 'E'), 
  Delay =   c(5, 32, 59, 86, 113, 0, 27, 54, 81, 108, 10, 37, 64, 91, 111, 118, 0, 27, 54, 81, 101, 108)
  )
   Name Group Delay
1  lorem     E     5
2  lorem     D    32
3  lorem     C    59
4  lorem     B    86
5  lorem     A   113
6  ipsum     E     0
7  ipsum     D    27
8  ipsum     C    54
9  ipsum     B    81
10 ipsum     A   108
11 dolor     C    10
12 dolor     A    37
13 dolor     B    64
14 dolor     D    91
15 dolor     F   111
16 dolor     E   118
17  amet     C     0
18  amet     A    27
19  amet     B    54
20  amet     D    81
21  amet     F   101
22  amet     E   108

वांछित आउटपुट होगा (हालांकि प्रत्येक जोड़ी के लिए उच्च विलंब मान रखने से चोट नहीं पहुंचेगी):

Name    Source  Target
lorem   E       D
lorem   D       C
lorem   C       B
ipsum   B       A
ipsum   E       D
ipsum   D       C
ipsum   C       B
ipsum   B       A
dolor   C       A
dolor   A       B
dolor   B       D
dolor   D       F
dolor   F       E
amet    C       A
amet    A       B
amet    B       D
amet    F       E

अंततः, यह networkD3 पैकेज का उपयोग करके एक sankeyNetwork ग्राफ़ में जाएगा।

मैंने नाम (सॉर्टिंग के बाद) में एक मैच के लिए अगली पंक्ति को देखते हुए निम्नलिखित कोशिश की, हालांकि यह मेरे वास्तविक डेटा पर अपेक्षित काम नहीं करता लेकिन डमी डेटा पर कुछ भी नहीं करता है:

l = data.frame(Name = character(), From = character(), Target = character())

for(i in 1:(nrow(df) - 1)){
  if(df$Name[i] == df$Name[i + 1])
  {
    From = as.character(df$Group[i])
    Target = as.character(df$Group[i + 1])
    Name = as.character(df$Name[i])
  }
  links = rbind(l, list(Name = as.character(Name), From = as.character(From), Target = as.character(Target)))
}
r
1
ginopono 15 अप्रैल 2020, 20:58

1 उत्तर

सबसे बढ़िया उत्तर

हम एक समूह बना सकते हैं और lead ले सकते हैं

library(dplyr)
df %>%
   group_by(Name) %>%
   transmute(Source = Group, 
             Target = lead(Group, order_by = Delay),
             Value = lead(Delay, order_by = Delay)) %>%
   na.omit
1
CJ Yetman 19 अप्रैल 2020, 12:20