2016-08-04 3 views
0

Ich habe einen Datenrahmen, Beispiel wie folgt.Ersetzen Sie Teilwerte aus einer Spalte in einem R-Datenframe

 chr start2  end2 value 
88 chrom16 56063633 56063634 0.238 
78 chrom12 83039622 83039623 0.429 
50 chrom12 73209081 73209082 0.313 
68 chrom12 75138610 75138611 0.679 
45 chrom12 67566601 67566602 0.859 
120 chrom16 57694245 57694246 0.438 

Ich möchte Teilwerte von einer Spalte ändern. In diesem Datenrahmen würde Ich mag „chrom“ auf „chr“ in Spalte 2 soll

OUTPUT wie

 chr start2  end2 value 
88 chr16 56063633 56063634 0.238 
78 chr12 83039622 83039623 0.429 
50 chr12 73209081 73209082 0.313 
68 chr12 75138610 75138611 0.679 
45 chr12 67566601 67566602 0.859 
120 chr16 57694245 57694246 0.438 
+0

Verwenden 'sub (". ({3}) {2} (\\ d +)", "\\ 1 \\ 2", df1 $ chr) ' – akrun

Antwort

1

das Muster einfach ist wie in Ihrem Beispiel Wenn es so aussehen ändern können Sie einfach ersetzen das "om" in "chrom" mit einer leeren Zeichenfolge.

df <- read.table(text = " chr start2  end2 value 
           88 chrom16 56063633 56063634 0.238 
           78 chrom12 83039622 83039623 0.429 
           50 chrom12 73209081 73209082 0.313 
           68 chrom12 75138610 75138611 0.679 
           45 chrom12 67566601 67566602 0.859 
           120 chrom16 57694245 57694246 0.438", header = TRUE) 

df$chr <- sub("om", "", df$chr) 

df 
#   chr start2  end2 value 
# 88 chr16 56063633 56063634 0.238 
# 78 chr12 83039622 83039623 0.429 
# 50 chr12 73209081 73209082 0.313 
# 68 chr12 75138610 75138611 0.679 
# 45 chr12 67566601 67566602 0.859 
# 120 chr16 57694245 57694246 0.438 
+0

Es funktioniert jedoch die bearbeitete Spalte wird als neue Spalte nach Wert platziert. – panbar

+0

@panbar Haben Sie gerade meinen Code kopiert? Denn dann sollte es nicht passieren, weil Sie nur die Werte in der alten Spalte ersetzen. Es wird keine neue Spalte erstellt. – Alex

+0

Danke. Es funktionierte. – panbar

1

Wir sub verwenden, um die ersten 3 Zeichen als eine Gruppe von passenden Zeichen 2 und dann erfassen die Zahlen gefolgt zu erfassen, ersetzen sie durch die Rückreferenzierungen (\\1 und \\2 für die erfassten Gruppen).

df1$chr <- sub("(.{3}).{2}(\\d+)", "\\1\\2", df1$chr) 
df1$chr 
#[1] "chr16" "chr12" "chr12" "chr12" "chr12" "chr16" 

Oder wir können auch lookarounds

sub(".{2}(?=\\d)", "", df1$chr, perl = TRUE) 
#[1] "chr16" "chr12" "chr12" "chr12" "chr12" "chr16" 

Dies sollte funktionieren verwenden auch wenn die Zeichenfolge Elemente geändert werden. Eine andere schnellere Option ist substr basierend auf der Position des Zeichens.

df1$chr <- with(df1, paste0(substr(chr, 1, 3), substr(chr, 6,7))) 
df1$chr 
#[1] "chr16" "chr12" "chr12" "chr12" "chr12" "chr16" 
0

zwei Möglichkeiten:

data <- read.table(text = 'chr  start2 end2  value 
          chrom16 56063633 56063634 0.238 
          chrom12 83039622 83039623 0.429 
          chrom12 73209081 73209082 0.313 
          chrom12 75138610 75138611 0.679 
          chrom12 67566601 67566602 0.859 
          chrom16 57694245 57694246 0.438', 
        stringsAsFactors = FALSE, 
        header = TRUE) 

# stringr package + base R for assignment 
library(stringr) 
data['chr'] <- str_replace(data[['chr']], "chrom", "chr") 

data 
# chr start2  end2 value 
# 1 chr16 56063633 56063634 0.238 
# 2 chr12 83039622 83039623 0.429 
# 3 chr12 73209081 73209082 0.313 
# 4 chr12 75138610 75138611 0.679 
# 5 chr12 67566601 67566602 0.859 
# 6 chr16 57694245 57694246 0.438 

# with stringr and dplyr packages 
library(dplyr) 
data <- 
    data %>% 
    mutate(chr = str_replace(chr, "chrom", "chr")) 

data 
# chr start2  end2 value 
# 1 chr16 56063633 56063634 0.238 
# 2 chr12 83039622 83039623 0.429 
# 3 chr12 73209081 73209082 0.313 
# 4 chr12 75138610 75138611 0.679 
# 5 chr12 67566601 67566602 0.859 
# 6 chr16 57694245 57694246 0.438