如何在 R 中创建 for 循环来迭代两个数据帧中的列名称列表并输出每个样本的匹配/不匹配?

问题描述 投票:0回答:1

我有两个具有相同列名的数据集,我尝试根据样本 ID 比较各列的数据。例如:

  df1 <- data.frame(sample_ID = c('animal1', 'animal2', 'animal3', 'animal4', 'animal5'),
                  loci1 = c('T,T', 'A,T', 'C,T', 'T,T', 'T,G'),
                  loci2 = c('G,T', 'T,T', 'A,T', 'T,T', 'T,A'))
  df2 <- data.frame(sample_ID = c('animal1', 'animal2', 'animal3', 'animal4', 'animal5'),
                  loci1 = c('T,T', 'A,T', 'C,T', 'A,A', 'C,G'),
                  loci2 = c('T,T', 'T,A', 'A,T', 'T,G', 'T,A'))

我想开发一个代码来检查 df1$loci1 是否与 Animal1 的 df2$loci1 相同,依此类推,因为我有 200 只动物和 70 多个基因座要迭代。理想情况下,创建一个新列,其中每个位点指示“匹配”或“不匹配”。

我首先连接两个数据帧,然后使用 mutate 创建一个新列,该列输出两个数据帧的 loci1 是否匹配:

   df3 <- df1 %>%
    inner_join(df2, by = 'sample_ID') %>%
      mutate(match_loci1 = c('no_match', 'match')[1 + (loci1.x == loci1.y)])

这对于 1 个位点来说效果很好,但由于我有相当多的位点需要完成,我希望得到帮助来开发一个 for 循环,该循环将在我之后迭代现在标记为 loci$.x 和 loci$.y 的不同位点使用inner_join,并为每个“match_loci1”、“match_loci2”等创建一个新列

我已经创建了所有基因座的列表并启动了 for 循环:

loci_names <- colnames(df1)

  test2 <- df1 %>% 
  inner_join(df2, by = 'sample_ID') %>%
  for (i in loci_list) {
    mutate(match$[[i]] = c('no_match', 'match')[1 + [[i]]$.x == [[i]]$.y])
  }

但我收到此错误:

Error: unexpected '[[' in: "  for (i in loci_list) { mutate(match$[["

我不确定如何格式化变异操作,以便它将迭代每个基因座。

r for-loop inner-join mutate
1个回答
0
投票

我将转换您的数据,然后加入:

library(dplyr)
library(tidyr)  
df1 |> pivot_longer(-sample_ID, names_to = "loci_i", values_to = "df1_value") |>
  full_join(
    df2 |> pivot_longer(-sample_ID, names_to = "loci_i", values_to = "df2_value"),
    by = c("sample_ID", "loci_i")
  ) |>
  mutate(is_match = df1_value == df2_value)
# # A tibble: 10 × 5
#    sample_ID loci_i df1_value df2_value is_match
#    <chr>     <chr>  <chr>     <chr>     <lgl>   
#  1 animal1   loci1  T,T       T,T       TRUE    
#  2 animal1   loci2  G,T       T,T       FALSE   
#  3 animal2   loci1  A,T       A,T       TRUE    
#  4 animal2   loci2  T,T       T,A       FALSE   
#  5 animal3   loci1  C,T       C,T       TRUE    
#  6 animal3   loci2  A,T       A,T       TRUE    
#  7 animal4   loci1  T,T       A,A       FALSE   
#  8 animal4   loci2  T,T       T,G       FALSE   
#  9 animal5   loci1  T,G       C,G       FALSE   
# 10 animal5   loci2  T,A       T,A       TRUE    
© www.soinside.com 2019 - 2024. All rights reserved.