Frage

Ich habe einen großen Datensatz mit einer Mischung aus Zahlen und Alphabeten.Nur ein kleines Beispiel:

sex <- c("M", "F", "F", "M", "M")
 ind <- c("I1", "I2", "I3", "I4", "C")
M1 <- c("ab", "bb", "ac", "ad", "dd")
M2 <- c(12, 22, 23, 24, 25)
M3 <- c("AT", "AG", "AC", "GG", "TC")
 M4 <- c(22, 23, 24, 14, 24)
mydf <- data.frame(sex, ind, M1, M2, M3, M4)
mydf
  sex ind M1 M2 M3 M4
1   M  I1 ab 12 AT 22
2   F  I2 bb 22 AG 23
3   F  I3 ac 23 AC 24
4   M  I4 ad 24 GG 14
5   M   C dd 25 TC 24

Ich möchte ein "/" zwischen zwei Zeichen in den Spalten M1 ...... Mn (Ende der Datei) einfügen, damit der resultierende Datenrahmen wie folgt aussieht:

       sex ind M1 M2 M3 M4
    1   M  I1 a/b 1/2 A/T 2/2
    2   F  I2 b/b 2/2 A/G 2/3
    3   F  I3 a/c 2/3  A/C 2/4
    4   M  I4 a/d 2/4 G/G 1/4
    5   M   C d/d 2/5 T/C 2/4

Entschuldigung, ich hatte keine Ahnung, wie ich vorgehen soll ... Ihre Hilfe wurde geschätzt ...

War es hilfreich?

Lösung

Einer Liner: generasacodicetagpre.

Andere Tipps

Die gesamte kryptische Kraft von R gibt Ihnen Folgendes:

  • splitInsert teilt eine Spalte an jedem Buchstaben mit strsplit und kombiniert sie mit paste neu.Dies wird in sapply eingeschlossen, um die Funktion zu vektorisieren.
  • Ich verwende dann lapply, um splitInsert auf die Spalten 3: 6 Ihres data.frame anzuwenden, und data.frame, um ihn mit den beiden Spalten zu kombinieren, die Sie nicht ändern möchten.
  • Beachten Sie, dass splitInsert vollständig allgemein gehalten ist - es funktioniert für Textzeichenfolgen beliebiger Länge und Sie können jedes neue Zeichen Ihrer Wahl verwenden, um die geteilten Elemente neu zu kombinieren

    Der Code:

    splitInsert <- function(x, split="", new="/"){
      sapply(x, function(y)
        paste(
          strsplit(as.character(y), split=split)[[1]], 
          collapse=new)
             )
    }
    
    data.frame(mydf[, 1:2], lapply(mydf[, 3:ncol(mydf)], splitInsert))
    

    Die Ergebnisse:

      sex ind  M1  M2  M3  M4
    1   M  I1 a/b 1/2 A/T 2/2
    2   F  I2 b/b 2/2 A/G 2/3
    3   F  I3 a/c 2/3 A/C 2/4
    4   M  I4 a/d 2/4 G/G 1/4
    5   M   C d/d 2/5 T/C 2/4
    

Dies scheint zu funktionieren.

m1 <- substr(mydf$M1, start=1, stop=1)
m2 <- substr(mydf$M1, start=2, stop=2)
paste(m1, m2, sep="/")

Ausgabe

[1] "a/b" "b/b" "a/c" "a/d" "d/d"

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top