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?
Bitte überprüfen Sie Ihre zweite Liste Artikel 2, ist etwas nicht richtig –
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
Ich bin mir nicht sicher, ob ich Ihre Frage verstehe, sicherlich wird jemand anderes antworten –