按两个变量对行进行分组,按列对列值进行排序,然后进行连接

时间:2017-08-02 21:15:23

标签: r sorting concatenation

我在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&#39;值。

1 个答案:

答案 0 :(得分:0)

每当我按列进行数据操作时,我都会转向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