2014-12-15 9 views
6

I-Daten sind munging, und zwar habe ich dieses pdf http://pubs.acs.org/doi/suppl/10.1021/ja105035r/suppl_file/ja105035r_si_001.pdf geöffnet und die Daten aus der Tabelle s4 geschabt,die Ergebnisse einer Berechnung Substituieren

1a 1b 1a 1b 
1 5.27 4.76 5.09 4.75 
2 2.47 2.74 2.77 2.80 
4 1.14 1.38 1.12 1.02 
6 7.43 7.35 7.22-7.35a 7.25-7.36a 
7 7.38 7.34 7.22-7.35a 7.25-7.36a 
8 7.23 7.20 7.22-7.35a 7.25-7.36a 
9(R) 4.16 3.89 4.12b 4.18b 
9(S) 4.16 3.92 4.12b 4.18b 
10 1.19 0.91 1.21 1.25 

es in dem Editor eingefügt und gespeichert es als txt-Datei .

s4 <- read.table("s4.txt", header=TRUE, stringsAsFactors=FALSE) 

gibt,

X1a X1b  X1a.1  X1b.1 
1 5.27 4.76  5.09  4.75 
2 2.47 2.74  2.77  2.80 
4 1.14 1.38  1.12  1.02 
6 7.43 7.35 7.22-7.35a 7.25-7.36a 
7 7.38 7.34 7.22-7.35a 7.25-7.36a 
8 7.23 7.20 7.22-7.35a 7.25-7.36a 

, um die Daten, die ich, um alles zu numerischen ändern müssen zu verwenden, und entfernen Sie die Buchstaben, dank diesem Link R regex gsub separate letters and numbers ich den folgenden Code verwenden können,

gsub("([[:alpha:]])","",s4[,3]) 

Ich kann die Fremdbuchstaben loswerden.

Was ich will jetzt tun, und der Punkt, der Frage, ist es, die Bereiche zu verändern,

"7.22-7.35" "7.22-7.35" "7.22-7.35" 

mit ihren Mitteln,

"7.29" 

Kann ich gsub für diesen Einsatz? (Oder müsste ich über den Bindestrich streiten, zu einem Vektor kombinieren und den Mittelwert zurückgeben?).

Antwort

3

Sie brauchen einen einzigen Regex in strsplit für diese Aufgabe (Buchstaben und Spaltung zu entfernen):

s4[] <- lapply(s4, function(x) { 
    if (is.numeric(x)) x 
    else sapply(strsplit(as.character(x), "-|[[:alpha:]]"), 
       function(y) mean(as.numeric(y))) 
}) 

Das Ergebnis:

> s4 
    X1a X1b X1a.1 X1b.1 
1 5.27 4.76 5.090 4.750 
2 2.47 2.74 2.770 2.800 
4 1.14 1.38 1.120 1.020 
6 7.43 7.35 7.285 7.305 
7 7.38 7.34 7.285 7.305 
8 7.23 7.20 7.285 7.305 
+0

Dank (und dank den anderen Mitwirkenden) einige nützliche Tipps – user1945827

2

etwas wie folgt aus:

mean(as.numeric(unlist(strsplit("7.22-7.35","-")))) 

sollte funktionieren (und entsprechen dem, was Sie im Sinn hatte, glaube ich)

oder Sie tun können:

eval(parse(text=paste0("mean(c(",gsub("-",",","7.22-7.35"),"))"))) 

aber ich bin nicht sicher ist das einfacher ...

Um es auf einen Vektor anzuwenden:

vec<-c("7.22-7.35","7.22-7.35") 

1st solution : sapply(vec, function(x) mean(as.numeric(unlist(strsplit(x,"-"))))) 
2nd solution : sapply(vec, function(x) eval(parse(text=paste0("mean(c(",gsub("-",",",x),"))")))) 

In beiden Fällen erhalten Sie:

7.22-7.35 7.22-7.35 
    7.285  7.285 
+0

@DavidArenburg, nur sapply in Kombination verwendet, wird es ... – Cath

+0

Ich weiß, dass du 'sapply' benutzen kannst ...Wie auch immer, es scheint, als hätte das OP alle seine Bereiche gleich –

3

Hier ist ein Ansatz, der direkt an der Beispieldaten zu funktionieren scheint:

df[] <- lapply(df, function(col){ 
    col <- gsub("([[:alpha:]])","", col) 
    col <- ifelse(grepl("-", col), mean(as.numeric(unlist(strsplit(col[grepl("-", col)], "-")))), col) 
    as.numeric(col) 
}) 

> df 
# X1a X1b X1a.1 X1b.1 
#1 5.27 4.76 5.090 4.750 
#2 2.47 2.74 2.770 2.800 
#4 1.14 1.38 1.120 1.020 
#6 7.43 7.35 7.285 7.305 
#7 7.38 7.34 7.285 7.305 
#8 7.23 7.20 7.285 7.305 

Haftungsausschluss: Es funktioniert nur richtig wenn die Bereiche in jeder Spalte alle gleich sind (wie in den Beispieldaten)

0

, auch

library(gsubfn) 
indx <- !sapply(s4, is.numeric) 
s4[indx] <- lapply(s4[indx], function(x) 
      sapply(strapply(x, '([0-9.]+)', ~as.numeric(x)), mean)) 

s4 
# X1a X1b X1a.1 X1b.1 
#1 5.27 4.76 5.090 4.750 
#2 2.47 2.74 2.770 2.800 
#4 1.14 1.38 1.120 1.020 
#6 7.43 7.35 7.285 7.305 
#7 7.38 7.34 7.285 7.305 
#8 7.23 7.20 7.285 7.305 
Verwandte Themen