我有两个具有相同列名的数据集,我尝试根据样本 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$[["
我不确定如何格式化变异操作,以便它将迭代每个基因座。
我将转换您的数据,然后加入:
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