2015-12-16 57 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

是的。 @贺卡但我认为它可以作为字符。如果需要,我们可以将字符更改为整数。 –