【问题标题】:group rows by two variables, sort column values by list, then concatenate按两个变量对行进行分组,按列表对列值进行排序,然后连接
【发布时间】:2018-01-10 06:52:15
【问题描述】:

我在 R 中有一个长格式的数据框 (DF1),大约 430,000 行和 4 列。我想按文件对观察结果进行分组,然后按名称对观察结果进行分组,然后按列表定义的特定顺序进行排序,然后将 GT 列中的值连接起来。该表的格式如下:

# Assay Name  GT  file
# as1   Fred  AG  file1.csv
# as2   Fred  GT  file1.csv
# as3   Fred  TC  file1.csv
# as2   Curt  AG  file1.csv
# as1   Curt  GG  file1.csv
# as3   Curt  TT  file1.csv
# as1   Fred  AG  file2.csv
# as2   Fred  NA  file2.csv
# as3   Fred  TC  file2.csv

所需的输出如下所示:

# Name   GT_concatenated  
# Fred   AGGTTC
# Curt   GGAGTT
# Fred   AG  TC

这意味着 Assay 列需要先按此列表排序 c("as1","as2","as3") ,然后连接。我试过这个:

DF2<-aggregate(GT~file+Name,data=DF1,paste,collapse="")

这给了我想要的输出,但没有排序,“NA”值没有空格。

【问题讨论】:

  • 我有一个答案,但我删除了它,因为我不确定我是否理解您想要的输出。 Fred file1 行似乎不应该是 AGGTTC,但您已将其列为 GTAGGT。这似乎是 as2、as1、as3,我不明白。
  • @HarlandMason 我会继续发布您的答案,因为它可能是一个错字。您可以在进一步澄清后编辑您的答案
  • 是的,那个是错字。我更正了。

标签: r sorting concatenation


【解决方案1】:

每当我按列进行数据操作时,我都会转向 data.table

library('data.table')

DF1 <- as.data.table(DF1)

让我们按文件、名称和分析对数据进行排序。它看起来像一个直接的字母排序给出了所需的顺序,名称倒置如你的例子中

DF1 <- DF1[order(file, -Name, Assay)]

创建一个虚拟列,它是 GT 中的值,如果是 GT 中的值is.na(),则创建一个空格

DF1[, GT.space := ifelse(is.na(GT), ' ', GT)]

按名称执行折叠

DF1[, .(GT_concatenated = paste(GT.space, collapse='')), by=.(file, Name)]

使用我的数据版本,输出

        file Name GT_concatenated
1: file1.csv Fred          AGGTTC
2: file1.csv Curt          GGAGTT
3: file2.csv Fred           AG TC

如果你真的不想要文件列,那么

DF1[, .(GT_concatenated = paste(GT.space, collapse='')), by=.(file, Name)][, .(Name, GT_concatenated)]

产量

   Name GT_concatenated
1: Fred          AGGTTC
2: Curt          GGAGTT
3: Fred           AG TC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-26
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 2012-06-26
    • 1970-01-01
    相关资源
    最近更新 更多