2016-07-18 9 views
0

Ich habe Strings wie folgt aus:Split String bestellt Zahlen in R enthalten

"12385402763024590" 

Es enthält Zahlen in aufsteigender abwechselnd und absteigender Reihenfolge. Ich möchte sie basierend auf diesen Aufträgen teilen. Die Ausgabe wäre:

"1238" "540" "27" "630" "2459" "0" 

Wie können wir das in R tun?

+2

StackOverflow ist kein Code-Schreibdienst. Wir wissen es zu schätzen, wenn OP das Problem zur Verfügung stellt, ein minimales reproduzierbares Beispiel und Anstrengungen/Versuche, die bisher versucht wurden. –

+0

Durch die Angabe von Bemühungen/Versuchen können wir unsere Antworten besser auf die spezifischen Probleme zuschneiden, auf die Sie bisher gestoßen sind (falls vorhanden). Ich bin mehr als glücklich, Einblicke in das Problem * general * zu geben, aber da ich nicht weiß, welcher Teil der Aufgabe problematischer ist, ist es schwieriger zu wissen, wo die Betonung liegt. Was genau ist der Kern Ihres Problems? Ist es die Spaltung der Saite? Der Teil, wo Sie jeden Wert mit dem vorherigen/nächsten vergleichen müssen? Wie erstellt man eine Gruppe mit solchen Untergruppen, etc. –

+0

@ StevenBeaupré Vielleicht möchten Sie meine eigene Antwort sehen [HIER] (http://stackoverflow.com/questions/38443977/split-string-containing-ordered-numbers-in-r/38447631 # 38447631) – 989

Antwort

2

Sie auch zwei Vektoren passieren könnte zu substring

x <- "12385402763024590" 
substring(x, c(1,5,8,10,13,17), c(4,7,9,12,16,17)) 
[1] "1238" "540" "27" "630" "2459" "0" 

Vielleicht?

sp1 <- function(x){ 
    y <- as.numeric(strsplit(x, "")[[1]]) 
    n <- cumsum(rle(diff(y)<0)$lengths) +1 
    substring(x, c(1, n[-length(n)]+1), n) 
} 

sp1(x) 
[1] "1238" "540" "27" "630" "2459" "0" 
2

Hier ist eine Option mit rleid aus data.table Paket und die split Funktion von der Basis R:

library(data.table) 
strToNum <- as.numeric(strsplit(s, "")[[1]]) 
# split the string into numeric vectors 

sapply(split(strToNum, c(1, rleid(diff(strToNum) > 0))), paste0, collapse = "") 
# calculate the rleid for sequence in ascending or descending order and split the vector 
# based on the run length encoding ID. Since the first element will always be classified 
# into the first sequence, we prepend 1 in the resulting rleid. 

#  1  2  3  4  5  6 
# "1238" "540" "27" "630" "2459" "0" 
1

hier mit Basis R meine eigene Lösung:

f <- function(r, char_s){ 
    cuts <- c(0, which(diff(r) != 1), length(r)) 
    sapply(seq_along(tail(cuts,-1)), function(x) 
        paste0(char_s[r[(cuts[x]+1):cuts[x+1]]],collapse="")) 
} 

char_s <- strsplit(s, "")[[1]] 
dif <- c(1,diff(as.numeric(char_s))) 

# ascending orders 
f(which(dif>0), char_s) 
# [1] "1238" "27" "2459" 

# descending orders 
f(which(dif<0), char_s) 
# [1] "540" "630" "0" 
+0

Ich hatte dir dafür vorher plus eins gegeben. – akrun

+0

Wenn die Breiten angegeben sind, würde ich 'read.fwf' verwenden – akrun

+0

Oder eine andere Option ist' sub' dh 'scan (text = sub (" (. {4}) (. {3}) (. {2}) (. {3}) (. {4}) (.) "," \\ 1, \\ 2, \\ 3, \\ 4, \\ 5 ", str1), was = numerisch(), sep = ",") ' – akrun