2017-08-14 1 views
0

Ich arbeite tatsächlich mit genomischen Daten, und ich habe einen Datenrahmen, den ich Ihnen die ersten drei Zeilen zeigen werde (siehe Tabelle unten):Ersetzen Sie verschiedene Werte in einer Spalte, entsprechend der Zeile Informationen in einer anderen Spalte

Chrom | POS |  ID  | REF | ALT | HapA | HapB | 
---------------------------------------------------------- 
22 | 16495833 | rs116911124 | A | C | 1 | 0 | 
22 | 19873357 | rs116378360 | T | A | 0 | 1 | 
22 | 21416404 | rs117982183 | T | T | 0 | . | 

Also, ich möchte die Werte von "0", "1" und "." aus den Spalten "HapA" und "HapB" gemäß den Spalten REF und ALT für jede Zeile im Datenrahmen. Zum Beispiel:

a) Für die erste Zeile möchte ich die "1" in der HapA Spalte für das "C" in der ALT Spalte und die "0" in der HapB Spalte für den "A" Wert in ändern die REF-Spalte

b) für die zweite Zeile die "0" für das "T" in der Spalte "REF" und die "1" für das "A" in der Spalte "ALT" ändern.

c) Und schließlich für das "." ändere es für "NA"

Ich denke, dass dies mit "if else" oder mit data.table erreicht werden könnte.

Vielen Dank.

+0

Ist es immer die gleiche Regel 0 wird durch 'REF' Spalte und 1 durch' ALT' Spalte (und. Durch NA) ersetzen? –

+0

Also 'HapA' und' HapB' sind beide Zeichenspalten? Sie sind nicht numerisch oder Integer, da '.' kein gültiger Wert für diese ist. –

+0

@Slivero Hallo, ja Es ist immer die gleiche Regel, wo 0 durch REF Spalte und 1 durch ALT Spalte ersetzt wird –

Antwort

0

Es ist ein wenig unklar, was Sie genau wollen, da Sie nicht angeben, was mit dem 0 in der dritten Reihe der HapA Spalte passieren sollte, aber wenn man bedenkt, was Sie gesagt haben, ist dies eine dplyr Lösung:

library(dplyr) 

df <- read.table(text = " 
'Chrom'  'POS'  'ID'  'REF' 'ALT' 'HapA' 'HapB' 
22  16495833 'rs116911124' 'A'  'C'  1  0 
22  19873357 'rs116378360' 'T'  'A'  0  1 
22  21416404 'rs117982183' 'T'  'T'  0  .", header = T, stringsAsFactors = F) 

df %>% 
    mutate(HapA = ifelse(HapA == 1, ALT, ifelse(HapA == 0, REF, NA)), 
     HapB = ifelse(HapB == 1, ALT, ifelse(HapB == 0, REF, NA))) 

## Chrom  POS   ID REF ALT HapA HapB 
## 1 22 16495833 rs116911124 A C C A 
## 2 22 19873357 rs116378360 T A T A 
## 3 22 21416404 rs117982183 T T T <NA> 
+0

Hallo, Vielen Dank für Ihre Antwort, Es funktioniert perfekt zu meinen Daten ... –

0

Ich denke, if_else(), recode() oder case_when() könnte alle dafür arbeiten. Hier habe ich versucht, mutate_at() zu verwenden, um die Funktion auf HapA und HapB anzuwenden. Wenn einer der Werte in diesen Spalten nicht gleich 1,0 ist, oder. dann sollte die Funktion den Wert als Zeichenkette zurückgeben.

mutate_at(df, vars(HapA, HapB), 
    function(x) {case_when(x == 1 ~ .$ALT, 
        x == 0 ~ .$REF, 
        x == . ~ NA_character_, 
        TRUE ~ as.character(x)) }) 
0

war es nicht wirklich eine Frage, aber ich werde erraten, was es war:

Wie kann ich die Werte von HapA ersetzen und HapB folgende diese Regeln:

  1. Wenn "0", dann mit dem Wert von REF ersetzen.
  2. Wenn "1", dann durch den Wert ALT ersetzen.
  3. Wenn ".", dann durch NA ersetzen.

Bitte beachte, dass ich auch Zeichenspalten geh mal davon aus HapA und HapB sind, da . nicht ein numerischer Wert sein.

Wenn dies die richtige Interpretation ist, müssen keine ausgefallenen Tricks verwendet werden. Dies ist ein "Wenn-sonst-Problem". Hier ist eine Lösung mit data.table, die ich denke, ist in der genomischen Analyse üblich. Zuerst erstelle ich den Beispieldatensatz:

library(data.table) 

dt <- fread(
    header = TRUE, 
    colClasses = c(
    Chrom = "character", 
    POS = "integer", 
    ID = "character", 
    REF = "character", 
    ALT = "character", 
    HapA = "character", 
    HapB = "character" 
), 
    input = " 
Chrom POS  ID    REF  ALT  HapA HapB 
22  16495833 'rs116911124' 'A'  'C'  1  0 
22  19873357 'rs116378360' 'T'  'A'  0  1 
22  21416404 'rs117982183' 'T'  'T'  0  ." 
) 
dt 
# Chrom  POS   ID REF ALT HapA HapB 
# 1: 22 16495833 'rs116911124' 'A' 'C' 1 0 
# 2: 22 19873357 'rs116378360' 'T' 'A' 0 1 
# 3: 22 21416404 'rs117982183' 'T' 'T' 0 . 

Das war der lange Teil. Hier ist der kurze Teil.

dt[HapA == "0", HapA := REF] 
dt[HapA == "1", HapA := ALT] 
dt[HapA == ".", HapA := NA] 
dt[HapB == "0", HapB := REF] 
dt[HapB == "1", HapB := ALT] 
dt[HapB == ".", HapB := NA] 
dt 
# Chrom  POS   ID REF ALT HapA HapB 
# 1: 22 16495833 'rs116911124' 'A' 'C' 'C' 'A' 
# 2: 22 19873357 'rs116378360' 'T' 'A' 'T' 'A' 
# 3: 22 21416404 'rs117982183' 'T' 'T' 'T' NA 

I stark empfiehlt schreibe dies auf einfache Art und Weise aus, wie die oben genannten. Es ist kurz, hat wenig Wiederholungen und ist leicht auf einen Blick zu verstehen. Wenn Sie dies jedoch auf viele Spalten verallgemeinern möchten, müssten Sie viele sich wiederholende Zeilen schreiben. Also hier ist eine Loop-Version:

Verwandte Themen