R 条件具有长度>;1且仅使用第一个元素

R 条件具有长度>;1且仅使用第一个元素,r,if-statement,conditional,calculated-columns,R,If Statement,Conditional,Calculated Columns,我有一个数据帧,trip: > head(trip.mutations) Ref.y Variant.y 1 T C 2 G C 3 A C 4 T C 5 C A 6 G A 我想添加第三列mutType,它遵循以下规则: for (i in 1:nrow(trip)) { if(trip$Ref.y=='G' & trip$Variant.y=='T'|trip$Ref.y=='C' & trip

我有一个数据帧,trip:

> head(trip.mutations)
  Ref.y Variant.y
1 T     C 
2 G     C 
3 A     C  
4 T     C 
5 C     A 
6 G     A 
我想添加第三列mutType,它遵循以下规则:

for (i in 1:nrow(trip)) {
   if(trip$Ref.y=='G' & trip$Variant.y=='T'|trip$Ref.y=='C' & trip$Variant.y=='A') {
      trip[i, 'mutType'] <- "G:C to T:A"
   }
   else if(trip$Ref.y=='G' & trip$Variant.y=='C'|trip$Ref.y=='C' & trip$Variant.y=='G') {
      trip[i, 'mutType'] <- "G:C to C:G"
   }
   else if(trip$Ref.y=='G' & trip$Variant.y=='A'|trip$Ref.y=='C' & trip$Variant.y=='T') {
      trip[i, 'mutType'] <- "G:C to A:T"
   }
   else if(trip$Ref.y=='A' & trip$Variant.y=='T'|trip$Ref.y=='T' & trip$Variant.y=='A') {
      trip[i, 'mutType'] <- "A:T to T:A"
   }
   else if(trip$Ref.y=='A' & trip$Variant.y=='G'|trip$Ref.y=='T' & trip$Variant.y=='C') {
      trip[i, 'mutType'] <- "A:T to G:C"
   }
   else if(trip$Ref.y=='A' & trip$Variant.y=='C'|trip$Ref.y=='T' & trip$Variant.y=='G') {
      trip[i, 'mutType'] <- "A:T to C:G"
   }
}
我不认为我的逻辑语句应该产生向量,但也许我遗漏了什么。trip$mutType最终应该是这样的:

mutType
A:T to G:C
G:C to C:G
A:T to C:G
A:T to G:C
G:C to T:A
G:C to A:T

有人能发现这里出了什么问题吗?我是否需要| |而不是|也许?

您会得到错误,因为
if
只能计算长度为1的
逻辑
向量

也许您忽略了
&
)和
&
|
)之间的区别。较短的版本按元素工作,较长的版本仅使用每个向量的第一个元素,例如:

c(TRUE, TRUE) & c(TRUE, FALSE)
# [1] TRUE FALSE

# c(TRUE, TRUE) && c(TRUE, FALSE)
[1] TRUE
您根本不需要
if
语句:

mut1 <- trip$Ref.y=='G' & trip$Variant.y=='T'|trip$Ref.y=='C' & trip$Variant.y=='A'
trip[mut1, "mutType"] <- "G:C to T:A"

mut1正如sgibb所说,这是一个if问题,与|或| |无关

以下是解决问题的另一种方法:

for (i in 1:nrow(trip)) {
  if(trip$Ref.y[i]=='G' & trip$Variant.y[i]=='T'|trip$Ref.y[i]=='C' & trip$Variant.y[i]=='A') {
    trip[i, 'mutType'] <- "G:C to T:A"
  }
  else if(trip$Ref.y[i]=='G' & trip$Variant.y[i]=='C'|trip$Ref.y[i]=='C' & trip$Variant.y[i]=='G') {
    trip[i, 'mutType'] <- "G:C to C:G"
  }
  else if(trip$Ref.y[i]=='G' & trip$Variant.y[i]=='A'|trip$Ref.y[i]=='C' & trip$Variant.y[i]=='T') {
    trip[i, 'mutType'] <- "G:C to A:T"
  }
  else if(trip$Ref.y[i]=='A' & trip$Variant.y[i]=='T'|trip$Ref.y[i]=='T' & trip$Variant.y[i]=='A') {
    trip[i, 'mutType'] <- "A:T to T:A"
  }
  else if(trip$Ref.y[i]=='A' & trip$Variant.y[i]=='G'|trip$Ref.y[i]=='T' & trip$Variant.y[i]=='C') {
    trip[i, 'mutType'] <- "A:T to G:C"
  }
  else if(trip$Ref.y[i]=='A' & trip$Variant.y[i]=='C'|trip$Ref.y[i]=='T' & trip$Variant.y[i]=='G') {
    trip[i, 'mutType'] <- "A:T to C:G"
  }
}
<代码>用于(i/1:nrow(行程)){ 如果(行程$Ref.y[i]='G'和行程$Variant.y[i]='T'|行程$Ref.y[i]='C'和行程$Variant.y[i]='A'){ trip[i,'mutType']
for (i in 1:nrow(trip)) {
  if(trip$Ref.y[i]=='G' & trip$Variant.y[i]=='T'|trip$Ref.y[i]=='C' & trip$Variant.y[i]=='A') {
    trip[i, 'mutType'] <- "G:C to T:A"
  }
  else if(trip$Ref.y[i]=='G' & trip$Variant.y[i]=='C'|trip$Ref.y[i]=='C' & trip$Variant.y[i]=='G') {
    trip[i, 'mutType'] <- "G:C to C:G"
  }
  else if(trip$Ref.y[i]=='G' & trip$Variant.y[i]=='A'|trip$Ref.y[i]=='C' & trip$Variant.y[i]=='T') {
    trip[i, 'mutType'] <- "G:C to A:T"
  }
  else if(trip$Ref.y[i]=='A' & trip$Variant.y[i]=='T'|trip$Ref.y[i]=='T' & trip$Variant.y[i]=='A') {
    trip[i, 'mutType'] <- "A:T to T:A"
  }
  else if(trip$Ref.y[i]=='A' & trip$Variant.y[i]=='G'|trip$Ref.y[i]=='T' & trip$Variant.y[i]=='C') {
    trip[i, 'mutType'] <- "A:T to G:C"
  }
  else if(trip$Ref.y[i]=='A' & trip$Variant.y[i]=='C'|trip$Ref.y[i]=='T' & trip$Variant.y[i]=='G') {
    trip[i, 'mutType'] <- "A:T to C:G"
  }
}