2015-12-16 102 views
0

我有一張如下表格。我喜歡根據與第三列的比較來替換每個樣本值,並用(0,1,2,3)對每個值進行編碼。例如,如果每行中的樣本值= REF_REF - > 1;如果每行中的樣本值= REF_ALT - > 2;如果每行中的樣本值= ALT_ALT - > 3和用於0/0 - > 0用列的值替換每行的值?

REF_REF REF_ALT ALT_ALT  sample1  sample2  sample3 

A/A   A/G  G/G    0/0   A/G   G/G 

T/T   T/C  C/C    T/T   T/C   T/C 

C/C   C/G G/G    0/0   C/G   C/G 

我喜歡讓一個表等作爲:

REF_REF REF_ALT ALT_ALT  sample1  sample2  sample3 

A/A   A/G  G/G   0    2   3 

T/T   T/C  C/C   1    2   2 

C/C  C/G  G/G   0    2   2 

另外,我用這個命令,但不行。

l=c() 

for (i in seq_along(data)) 

{ 
data=data[1,] 

Ref_Ref=data$Ref_Ref 

Alt_Alt=data$Ref_Ref 

Ref_Alt=data$Ref_Alt 

with(data[], ifelse(data == Ref_Ref, 1, ifelse(data == Alt_Alt, 3, 
if((data==Ref_Alt) 2)))) 

if(data=Ref_Ref, data=1) 

l[1,]=if(data==Ref_Ref, 1) 

    l[1] <- if (data %in% data$Ref_Ref) 1 else if (data %in% data$Alt_Alt) 3 else if (data %in% data$Alt_Alt) 2 else 0 
} 
+0

任何你自己試過的東西?爲什麼它不起作用? – Heroka

+0

升= C() 爲(i的seq_along(數據)) { 數據=數據[1,] Ref_Ref =數據$ Ref_Ref Alt_Alt =數據$ Ref_Ref Ref_Alt =數據$ Ref_Alt 與(數據[] ,ifelse(data == Ref_Ref,1,ifelse(data == Alt_Alt,3,if((data == Ref_Alt)2)))) if(data = Ref_Ref,data = 1) l [1,] =如果(data == Ref_Ref,1) l [1] < - if(data%in%data $ Ref_Ref)1 else if(data%in%data $ Alt_Alt)3 else if(data%in%data $ Alt_Alt )2 else 0 } – star

+0

你可以把它放在問題上嗎?不要在評論中提供額外的信息。 – Heroka

回答

2

這可能適合你。它按行分割數據,並使用R中因子的有用屬性。對於每一行,我們從樣本中創建一個因子,其中0/0級別,接着是ref_ref,ref_alt和alt_alt。然後我們將此因子轉換爲數字,然後減去1以獲得所需的輸出。

recoded_samples <- apply(dat,1,function(x) { 
    res <- as.numeric(factor(x[4:6],levels = c("0/0",x[1:3]))) - 1 
    res 
}) 

然後我們可以複製dat到一個結果變量(我不喜歡覆蓋變量),並替換列。請注意,我們需要調換'res'。

outcome <- dat 
outcome[,4:6] <- t(res) 

> outcome 
    REF_REF REF_ALT ALT_ALT sample1 sample2 sample3 
1  A/A  A/G  G/G  0  2  3 
2  T/T  T/C  C/C  1  2  2 
3  C/C  C/G  G/G  0  2  2 
0

虛擬的方法。

text1 <- "REF_REF REF_ALT ALT_ALT  sample1  sample2  sample3 
A/A   A/G  G/G    0/0   A/G   G/G 
T/T   T/C  C/C    T/T   T/C   T/C 
C/C   C/G G/G    0/0   C/G   C/G" 

df <- read.table(text=text1, head=T, as.is=T) 

for (x in 4:ncol(df)) { 
    df[,x][df[,x]=="0/0"] <- 0 
    df[,x][df[,x]==df[,1]] <- 1 
    df[,x][df[,x]==df[,2]] <- 2 
    df[,x][df[,x]==df[,3]] <- 3 
} 
# change characters to integers 
df[,4:6] <- as.integer(as.matrix(df[, 4:6])) 
df 
+0

這不會將數字轉換爲字符嗎? – Heroka

+0

是的。 @賀卡但我認爲它可以作爲字符。如果需要,我們可以將字符更改爲整數。 –