我在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;值。
答案 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