用列的值替换每行的值?

时间:2015-12-16 15:25:50

标签: sql r replace

我有一张如下表格。我喜欢在与第三个第一列进行比较时替换每个样本值,并使用(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  
}

2 个答案:

答案 0 :(得分: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复制到结果变量(我不喜欢覆盖变量),并替换列。请注意,我们需要转置&#39; res&#39;。

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

答案 1 :(得分: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
相关问题