【问题标题】:Compare each column of one dataframe with another dataframe column and print each resulting overlap to separate files将一个数据框的每一列与另一个数据框列进行比较,并将每个结果重叠打印到单独的文件中
【发布时间】:2020-09-10 01:38:21
【问题描述】:

我想将一个数据框的每一列与另一个数据框列进行比较,并将每个结果重叠打印到单独的文件中。

我从两个测试数据集开始:

df1 <- data.frame("x" = c("a_b", "c_d", "e_f/c_f", "g_h"),
                  "y" = c(9,2,1,4),
                  "z" = c(7,5,8,5))
df2 <- data.frame("m" = c("c_f", "x_y"),
                  "n" = c("a_b", "x_y"))

并使用 for 循环获取结果。

for (i in colnames(df2)){ 
  ccc<-df1[grep(paste(df2[,i], collapse = "|"), df1$x), ]
  write.csv(ccc, file = paste(i, ".csv", sep=""))
}

一切看起来都很好。

现在我正在我的完整数据集中尝试相同的循环(下面是修改后的 df1 和 df2):

df1<- structure(list(BGC_Accession = structure(c(1L, 1L, 1L, 2L), .Label = c("BGC0000647", 
"BGC0000984"), class = "factor"), Genbank_ID = structure(c(1L, 
3L, 2L, 4L), .Label = c("GCA_000202835", "GCA_000219295", "GCA_000964345", 
"GCA_003029685"), class = "factor"), BGC_Class = structure(c(2L, 
2L, 2L, 1L), .Label = c("NRP/Polyketide", "Terpene"), class = "factor"), 
    BGC_Start = c(2093957L, 1L, 1L, 2656134L), BGC_End = c(2115021L, 
    4440L, 4186L, 2721658L), Product = structure(c(1L, 1L, 1L, 
    2L), .Label = c("Carotenoid", "Delftibactin"), class = "factor"), 
    Similarity = structure(c(1L, 1L, 1L, 1L), .Label = "100%", class = "factor"), 
    Species_name = structure(c(1L, 4L, 2L, 3L), .Label = c("Acidiphilium_multivorum", 
    "Acidiphilium_sp_PM", "Acidovorax_avenae/Acidovorax_avene", 
    "Acinetobacter_baumannii"), class = "factor"), Kingdom = structure(c(1L, 
    1L, 1L, 1L), .Label = "k__Bacteria", class = "factor"), Phylum = structure(c(1L, 
    1L, 1L, 1L), .Label = "p__Proteobacteria", class = "factor"), 
    Class = structure(c(1L, 1L, 1L, 2L), .Label = c("c__Alphaproteobacteria", 
    "c__Betaproteobacteria"), class = "factor"), Order = structure(c(2L, 
    2L, 2L, 1L), .Label = c("o__Burkholderiales", "o__Rhodospirillales"
    ), class = "factor"), Family = structure(c(1L, 1L, 1L, 2L
    ), .Label = c("f__Acetobacteraceae", "f__Comamonadaceae"), class = "factor"), 
    Genus = structure(c(1L, 1L, 1L, 2L), .Label = c("g__Acidiphilium", 
    "g__Acidovorax"), class = "factor"), Species = structure(c(1L, 
    1L, 2L, 3L), .Label = c("s__Acidiphilium_multivorum", "s__Acidiphilium_sp_PM", 
    "s__Acidovorax_avenae"), class = "factor")), class = "data.frame", row.names = c(NA, 
-4L))
df2<- structure(list(Gut_SRS011111 = structure(c(2L, 1L, 1L), .Label = c("", 
"Actinobaculum_unclassified"), class = "factor"), Gut_SRS011269 = structure(c(3L, 
1L, 2L), .Label = c("Acidiphilium_multivorum", "Acinetobacter_baumannii", 
"Clostridium_citroniae"), class = "factor"), Gut_SRS011355 = structure(c(2L, 
3L, 1L), .Label = c("", "Acidovorax_avene", "Streptococcus_gordonii"
), class = "factor")), class = "data.frame", row.names = c(NA, 
-3L))

使用上面的脚本:

for (i in colnames(df2)){ 
  overlap_data<-df1[grep(paste(df2[,i], collapse = "|"), df1$Species_name), ]
  write.csv(overlap_data, file = paste(i, ".csv", sep=""))
}

似乎只有三个重叠列中的一个(在 df2 中)给出了正确的结果。 例如,在 df2 的第一列中,与 df1 没有重叠,它应该给出一个空白的结果文件。第二列输出文件看起来不错。在第三个文件中,我应该得到一个重叠,而不是输出文件中给出的四个。

我做错了什么?

感谢您的耐心等待!

【问题讨论】:

  • 查看您的正则表达式。这个模式,"",匹配任何东西。这是一个 MCVE 供您使用 grep("a|", letters)

标签: r


【解决方案1】:

问题似乎是空的"" 单元格,应该是NA

df2[df2 == ""] <- NA

现在,grep 应该可以工作了。我在这里使用lapply 而不是for 循环:

invisible(lapply(names(df2), function(x) {
  rr <- df1[grep(paste0(df2[,x], collapse= "|"), df1$Species_name), ]
  write.csv(rr, file = paste(x, ".csv", sep=""))
}))

invisible 避免了不必要和无聊的输出到控制台,你也可以省略它。)

【讨论】:

  • 谢谢,但这里缺少与“/”交替匹配的条件。 df2 中的第三列应该有一个命中。
  • @Bob 你是对的,match 不会那么容易工作,grep 更好。我想我找到了问题,请参阅更新。
  • 我明白了。你是对的,问题是那些空单元格。谢谢!
  • @Bob 是的,大多数情况下最好将类似的东西编码为NA
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-14
  • 1970-01-01
  • 2020-03-20
  • 1970-01-01
  • 2022-09-06
  • 2020-08-13
  • 1970-01-01
相关资源
最近更新 更多