【问题标题】:How to separate the dataframe matching keywords anywhere in the rows into two dataframes如何将行中任意位置的数据框匹配关键字分成两个数据框
【发布时间】:2016-03-18 19:13:32
【问题描述】:

我有一个名为mydf 的数据框,其中我有以GS0000XXXX-ASM 开头的示例行,其中包含high confidence 数据和low confidence 数据两部分。我想将每个样本行的高置信度数据和低置信度数据分开,并得到如下所示的结果。

mydf<-structure(list(assembly_id = c("GS000038075-ASM", "High confidence t(2:Y), t(5:7)", 
NA, "Low confidence t(2:Y), t(5:7)", NA, NA, "GS000038040-ASM", 
"High confidence t(1:17), t(2:6)", NA, "Low confidence t(1:17), t(2:6)", 
NA, NA), sample_id = c("GS02589-DNA_E06", NA, NA, NA, NA, NA, 
"GS02589-DNA_F01", NA, NA, NA, NA, NA), customer_sample_id = c("AMLM12001KP", 
NA, NA, NA, NA, NA, "1114002", NA, NA, NA, NA, NA), `>Id` = c(NA, 
"4264", NA, "217", "4264", "219", NA, "3329", "3764", "790", 
"1586", "3329"), LeftChr = c(NA, "chr2", NA, "chr2", "chr2", 
"chr2", NA, "chr1", "chr2", "chr1", "chr1", "chr1"), LeftPosition = c(NA, 
"133017438", NA, "133012293", "133017438", "133018715", NA, "207868617", 
"156528197", "91852788", "91852976", "207868617")), .Names = c("assembly_id", 
"sample_id", "customer_sample_id", ">Id", "LeftChr", "LeftPosition"
), row.names = c(1L, 3L, 5L, 6L, 7L, 8L, 17L, 19L, 20L, 22L, 
23L, 24L), class = "data.frame")

结果

result <- structure(list(assembly_id = c("GS000038075-ASM", "High confidence t(2:Y), t(5:7)", 
NA, "GS000038040-ASM", "High confidence t(1:17), t(2:6)", NA, 
"GS000038075-ASM", "Low confidence t(2:Y), t(5:7)", NA, NA, "GS000038040-ASM", 
"Low confidence t(1:17), t(2:6)", NA, NA), sample_id = c("GS02589-DNA_E06", 
NA, NA, "GS02589-DNA_F01", NA, NA, "GS02589-DNA_E06", NA, NA, 
NA, "GS02589-DNA_F01", NA, NA, NA), customer_sample_id = c("AMLM12001KP", 
NA, NA, "1114002", NA, NA, "AMLM12001KP", NA, NA, NA, "1114002", 
NA, NA, NA), `>Id` = c(NA, "4264", NA, NA, "3329", "3764", NA, 
"217", "4264", "219", NA, "790", "1586", "3329"), LeftChr = c(NA, 
"chr2", NA, NA, "chr1", "chr2", NA, "chr2", "chr2", "chr2", NA, 
"chr1", "chr1", "chr1"), LeftPosition = c(NA, "133017438", NA, 
NA, "207868617", "156528197", NA, "133012293", "133017438", "133018715", 
NA, "91852788", "91852976", "207868617")), .Names = c("assembly_id", 
"sample_id", "customer_sample_id", ">Id", "LeftChr", "LeftPosition"
), row.names = c("1", "3", "5", "17", "19", "20", "1.1", "6", 
"7", "8", "17.1", "22", "23", "24"), class = "data.frame")

【问题讨论】:

  • 为什么要复制行?
  • @akrun 因为每个 GS0000----ASM 行都有一组高置信度和低置信度数据。所以基本上我需要为每个样本行分离高置信度和低置信度数据。这样的样本行有 100 个。
  • 您可以尝试do.call(rbind,lapply(split(mydf, cumsum(!is.na(mydf$sample_id))), function(x) {gr1 &lt;- cumsum(!is.na(x[-1, 'assembly_id'])); do.call(rbind, lapply(split(x[-1,], gr1), function(y) rbind(x[1,], y)))})),然后如果您需要订购High vs Low,请使用grepl
  • 我点击了您的大部分问题,其中 个问题包含您的任何编码尝试。这不是您个人的代码编写服务,请分享您的尝试并尽最大努力
  • @akrun 谢谢,这很有帮助。您能否在下面用一些 cmets 回答它。

标签: regex r sorting


【解决方案1】:

我们通过基于“sample_id”列中的非 NA 值进行分组,将数据集 split 放入 list

lst <- split(mydf, cumsum(!is.na(mydf$sample_id)))

然后,循环遍历 list,创建另一个分组变量(可以在第一步中完成,但为了清楚起见),具有非 NA 值 'assembly_id' 、split list 元素和rbind 每个list 元素的第一行,用do.call(rbind 折叠列表列表,最后,我们将rbind 所有list 元素放在一起。

lst1 <- lapply(lst, function(x){
          gr1 <- cumsum(!is.na(x[-1, 'assembly_id']))
          do.call(rbind, 
            lapply(split(x[-1,], gr1), 
                 function(y) rbind(x[1,], y)))})

res <- do.call(rbind, lst1)
row.names(res) <- NULL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多