将 1 行数据与其余数据进行比较并跟踪差异

Compare 1 row of data to the rest of the data and track differences

我希望找到一种很好的方法来将大量数据与一个特定的数据行进行比较。我不需要将所有行与所有其他行进行比较,只需将 1 个特定行进行比较。我有一个大型遗传数据数据集(10808 个变量的 1040 个观察值),每列有一个碱基对。我附上了我的数据集的图像,因为我认为这是显示我正在使用的内容的更简单方法:

左边是序列名,很多栏是空的,但最终还是有基因数据:

我需要将每个序列的每个位置与第一个位置的序列 (L19088.1) 进行比较。这是“规范”序列,我对在单个碱基对水平上具有相似性和差异性的序列感兴趣。如果该值与规范值相同,则无需更改(该值可以保持原样)。如果该值与规范值不同,我想在该位置粘贴一个“X”。最后,我计划将每列中的 X 相加并从那里继续分析。我想把这一切都保存在 R 中。

换句话说,我想做这样的事情:

对于 df 中的每个位置 { 如果值 == 规范值,则复制值。 如果不是,请粘贴“X” }

尝试代码:

for (i in seq_along(df){
  ifelse(i == df$Sequence[1], paste[i], paste["X"])
}

但这当然行不通。我不确定如何在循环中指定规范序列的位置。任何建议将不胜感激!!

解决此问题的一种简单方法是遍历列。使用 canon 作为单个参考值,并使用 col 列的名称,我们可以将 "X" 写入所有异常值:

df[,col][ df[,col] != canon  ] <- 'X'

由于规范值是大写的,而其余的是小写的,我们必须先将 canon 设置为小写,并且我们需要在放置我们的 X-es 时排除第一行:

canon = tolower(canon)

df[-1,col][ df[-1,col] != canon  ] <- 'X'

完整代码

工作完整代码,包括对所有请求列的循环:

# create miniature example dataset
df <- data.frame(Sequence = c('L19088.1','chr1_1','chr1_2',
                              'chr1_3','chr1_4'),
                a = c('-','-','-','c','-'),
                b = c('G','g','a','g','g'),
                c = c('C','c','t','a','-') )

#   Sequence a b c
# 1 L19088.1 - G C
# 2   chr1_1 - g c
# 3   chr1_2 - a t
# 4   chr1_3 c g a
# 5   chr1_4 - g -
# choose columns to operate on
columns <- colnames(df)[-1] # all columns minus first one

# [1] "a" "b" "c"

# iterate over chosen columns
for(col in columns) {
  
  # optional: view status of column before edit
  cat('old:', df[,col], '\n')
  
  # get lowercase of canon value
  canon = tolower(df[1,col])
  
  # select df minus first row, column `col`, create a selection
  # of that where the value is *not* equal to the canon value,
  # and write 'X' to that selection
  df[-1,col][ df[-1,col] != canon  ] <- 'X'
  
  # optional: view status of column after edit
  cat('new:', df[,col], '\n\n')
  
}

# old: - - - c - 
# new: - - - X - 
#
# old: G g a g g 
# new: G g X g g 
#
# old: C c t a - 
# new: C c X X X 

结果df

> df
  Sequence a b c
1 L19088.1 - G C
2   chr1_1 - g c
3   chr1_2 - X X
4   chr1_3 X g X
5   chr1_4 - g X

旁注

您的数据框中有一些特殊性需要牢记:

  • 缺失值似乎是“-”而不是 NA
  • 列有数字标题,这是不允许的,而且并不总是有效
  • 规范的字母大写,与其他规范形成对比