2017-10-25 1 views
0

I einen Satz von alphanumerischen Vektoren haben:R wiederholt einzelne Zahlen innerhalb numerischer Mengen in verschachtelter Liste

lst <- list(c("三垣3-19", "6", "81497", "79992", "79101", 
"77760", "75973", "75411", "74666"), c("蒼龍1-01", "2", "66249", "65474", "66803", "64238"), c("蒼龍1-02", "1", "64238"), "蒼龍1-03") 

[[1]] 
[1] "三垣3-19" "6"  "81497" "79992" 
[5] "79101" "77760" "75973" "75411" 
[9] "74666" 

[[2]] 
[1] "蒼龍1-01" "2"  "66249" "65474" 
[5] "66803" "64238" 

[[3]] 
[1] "蒼龍1-02" "1"  "64238" 

[[4]] 
[1] "蒼龍1-03" 

Die zweite Zahl auf jedem Vektor (dh 6,2,1) repräsentiert die Gesamtzahl der Zeilen gezeichnet werden, um Sterne zu verbinden, die durch ihre HIP-Zahl nach rechts gegeben sind. Jedes Paar der HIP-Nummer zeigt eine Linie zwischen 2 Sternen an.

Daher 81497 79992 in [[1]] würde bedeuten „eine Linie zwischen Sternzahl zeichnen‚81.497‘und‚79.992‘, so weiter und so fort.

Im Fall einer durchgehenden Linie, wie [[1]], die Zahlen zwischen . „81497“ und „74666“ wiederholt werden soll, so dass es keine Unterbrechung in den Leitungen ist

so im Fall von [[1]] sollte "79992" "79101" "77760" "75973" "75411" wiederholt werden, um das folgende Ergebnis zu erhalten:

[[1]] 
[1] "三垣3-19" "6"  "81497" "79992" 
[5] "79992" "79101" "79101" "77760" 
[9] "77760" "75973" "75973" "75411" 
[13] "75411" "74666" 

[[2]] 
[1] "蒼龍1-01" "2"  "66249" "65474" 
[5] "66803" "64238" 

[[3]] 
[1] "蒼龍1-02" "1"  "64238" "64238" 

[[4]] 
[1] "蒼龍1-03" 

Da das zweite Element in jeder Liste die Gesamtzahl der zu zeichnenden Linien darstellt, kann ein Gültigkeitstest codiert werden, um anzugeben, ob bestimmte Zahlen wiederholt werden müssen. Somit bedeutet 6 in [[1]], dass es 6 Paare (d. H. 6 * 2 = 12 Elemente) der folgenden HIP-Nummern geben sollte. Wenn der Gültigkeitstest fehlschlägt, möchte ich, dass R die Zahlen zwischen dem dritten und letzten Element für mich wiederholt, damit die durchgehende Linie gezeichnet werden kann.


Die Teillösung I ist schustern up wie folgt verwaltet:

lapply(lst, function(x) x[2]) == (lengths(lst)-2)/2 
[1] FALSE TRUE FALSE NA 

Diese prüft die HIP-Werte für ihre Gültigkeit. Nur [[2]] passt in die Beschreibung in der ursprünglichen Liste. [[1]] und [[3]] wären die Vektoren, an denen wir arbeiten müssen.

Um einzelne Werte in-zwischen einem bestimmten Vektor zu wiederholen, könnte ich dies tun:

> x <- c(1,2,3,4,5) 
> x[2:4] <- lapply(x[2:4], function(x) rep(x, 2)) 
> unlist(x) 
[1] 1 2 2 3 3 4 4 5 

Da jedoch lst eine Liste ist, kann ich nicht tun:

lst[2:4] <- lapply(lst[2:4], function(x) rep(x, 2)) 

das gleiche zu bekommen Ergebnisse. Die Tatsache, dass die Endnummer (4 in diesem Fall) durch lengths(lst) spezifiziert werden muss, macht die Angelegenheit noch komplizierter.

Ich nehme an, der endgültige Code wäre eine ifelse() Funktion, um die beiden oben beschriebenen Funktionen zu verbinden.


Klärung der Regel:

Das zweite Element jedes Vektors stellt die gewünschte Anzahl von unterschiedlichen HIP Paare eine Linie zu zeichnen.

[[2]] ist gültig, weil 2 Paare von Zahlen folgen, die dem Wert in seinem zweiten Element entsprechen, so dass die Zahlen nicht wiederholt werden müssen.

In diesem Fall bilden die Linien höchstwahrscheinlich ein Kreuz und keine durchgehende Linie.Daher sollte die Regel nur im Falle einer durchgehenden Linie angewendet werden, z. B. [[1]].

Wie im Fall von [[3]] wird die Zahl in der Regel wiederholt, da nur ein Punkt existiert, so dass die Gültigkeit des zweiten Elements erhalten bleibt.


BUG UNTERSUCHUNG

@TUSHAr: Ihr Code scheint NA Werte zu erzeugen, wenn Elemente in den Vektoren nicht-numerische Werte enthalten.

lst <- list(c("三垣3-19", "6", "81497", "79992A", "79101", 
       "77760", "75973A", "75411", "74666"), c("蒼龍1-01", "2", "66249", "65474", "66803B", "64238"), c("蒼龍1-02", "1", "64238"), "蒼龍1-03") 

Führen Sie den Code mit den obigen Daten und Sie erhalten:

[[1]] 
[1] "三垣3-19" "6"  "81497" NA   NA   
[6] "79101" "79101" "77760" "77760" NA   
[11] NA   "75411" "75411" "74666" 

[[2]] 
[1] "蒼龍1-01" "2"  "66249" "65474" NA   
[6] "64238" 

[[3]] 
[1] "蒼龍1-02" "1"  "64238" "64238" 

[[4]] 
[1] "蒼龍1-03" 

Was ist der Grund dafür, und ist es eine Möglichkeit, es zu beheben?

+0

Bitte überprüfen Sie Ihre zweite Liste Artikel 2, ist etwas nicht richtig –

+0

Jedes Paar von HIP-Nummer eine Linie zwischen 2 Sterne gezogen anzeigt. Die Zahlen müssen sich nicht unbedingt wiederholen, wenn es sich nicht um eine durchgehende Linie handelt. – Sati

+0

Ich bin mir nicht sicher, ob ich Ihre Frage verstehe, sicherlich wird jemand anderes antworten –

Antwort

1

Speichern des ersten Werts jedes vector in lst in einer separaten Variablen id, um unnötige Untergruppen während der Verarbeitung zu vermeiden.

id = lapply(lst,function(t){t[1]}) 

das erste Element entfernt, die bereits in id gespeichert ist.

lst = lapply(lst,function(t){ 
    t=t[-1] 
    #if(length(t)>0){ 
    # as.integer(t) 
    #} 
}) 

Schleife durch das verarbeitete Objekt lst:

temp = lapply(lst,function(t){ 
#Use the first value as the desired number of pairs in `reqdpairs` 
    reqdpairs = as.numeric(t[1]) 
#remove the first values so that `t` only contains HIP numbers. 
    t=t[-1] 
#calculate existing number of pairs for case [[2]] such that if all conditions are satisfied we don't do any processing 
    noofpairs = floor(length(t)/2) 
#check if `t` contains values after removing the first element. The `else` part covers the case [[3]] 
    if(length(t)>1){ 
#If `noofpairs` is not equal to `reqdpairs` use `rep` on the inner elements (**excluding the first and last element**) of the vector. 
     if(noofpairs!=reqdpairs){ 
      pairs=c(reqdpairs,t[1],rep(t[-c(1,length(t))],each=2),t[length(t)]) 
     }else{ 
#In this case no processing is required so we just merge the reqdpairs with `t` as it is 
      pairs=c(reqdpairs,t) 
     } 
    }else if(length(t)==1){ 
     pairs=rep(t[1],times=2) 
     pairs=c(reqdpairs,pairs) 
    }else{ 
     pairs=NULL 
    } 
    pairs=as.character(pairs) 
} 
) 

Dieser Schritt ist mit idtemp fusioniert das gewünschte Ausgabeformat zu erreichen. Grundsätzlich nur ein Verkettungsschritt.

mapply(function(x,y){c(x,y)},id,temp) 


#[[1]] 
#[1] "三垣3-19" "6"  "81497" "79992" "79992" "79101" "79101" "77760" "77760" "75973" 
#[11] "75973" "75411" "75411" "74666" 

#[[2]] 
#[1] "蒼龍1-01" "2"  "66249" "65474" "66803" "64238" 

#[[3]] 
#[1] "蒼龍1-02" "1"  "64238" "64238" 

#[[4]] 
#[1] "蒼龍1-03" 
+0

Es funktioniert, danke! Kannst du mir den Code erklären? – Sati

+1

@Sati Erklärung hinzugefügt und ein paar redundante Schritte entfernt. – TUSHAr

+0

Der bearbeitete Code scheint den Wert vor den HIP-Nummern nach der Verarbeitung auszulassen. "[[1]] [1]" 3-19 81497 79992 79992 [5] 79101 79101 77760 77760 [9] 75973 75973 "" 75411 "" 75411 " [13]" 74666 "" Wie stellen wir das wieder her? – Sati

Verwandte Themen