2014-05-05 35 views
0

我有一个数据帧变更值,DF,其中一些在第二列中的值,ALT的,用逗号分隔:中的R有条件重复行,同时在一个单一的柱

ref alt 
ACTGG A,AATGG 
GGC G,GG 
GC  G 
AAT A,AA,AAA 

有没有一种方法在R中为我复制每列中有逗号分隔值的列df $ alt这样每个值分别显示?他们将被复制number_of_commas + 1次,以允许每个逗号分隔值显示一次。以下是我正在寻找的输出:

ref alt 
ACTGG AATGG 
ACTGG A 
GGC GG 
GGC G 
GC  G 
AAT AAA 
AAT AA 
AAT A 

此外,这只会更改第二列中的值。第一列和任何其他可能的列将被简单地复制。

+0

你真的需要重复的行? – Fernando

+0

@josilber感谢您提及我的问题!我将添加最适合本文的答案,因为另一方面的顶级解决方案不起作用。 – soosus

回答

2

您可以使用拆分申请,合并,单独处理的df每一行:

do.call(rbind, lapply(split(df, seq(nrow(df))), 
     function(x) data.frame(ref=x$ref, y=strsplit(x$alt, ",")[[1]]))) 
#  ref  y 
# 1.1 ACTGG  A 
# 1.2 ACTGG AATGG 
# 2.1 GGC  G 
# 2.2 GGC GG 
# 3  GC  G 
# 4.1 AAT  A 
# 4.2 AAT AA 
# 4.3 AAT AAA 
1
library(data.table) 
dt <- data.table(df) 
dt[, list(alt = unlist(strsplit(as.character(alt), ','))), 
     by = list(ref)] 

# ref alt 
# ACTGG AATGG 
# ACTGG A 
# GGC GG 
# GGC G 
# GC  G 
# AAT AAA 
# AAT AA 
# AAT A 
3

从我的 “splitstackshape” 包中的concat.split.multiple功能已经处理了这一点:

library(splitstackshape) 
concat.split.multiple(df, "alt", ",", "long") 

因为它使用reshape,所以会导致一些行的值为NA

但是,我会建议检查我一直在工作的功能的更新版本。 It's much faster and you can find it here。此版本与您选择的data.table方法类似,但您可以一次拆分多个列。

有了这个功能,你可以做到以下几点:

## Will convert your data.frame to a data.table 
cSplit(df, "alt", ",", direction="long") 
#  ref alt 
# 1: ACTGG  A 
# 2: ACTGG AATGG 
# 3: GGC  G 
# 4: GGC GG 
# 5: GC  G 
# 6: AAT  A 
# 7: AAT AA 
# 8: AAT AAA 

拆分为“宽”的形式是本默认:

cSplit(df, "alt", ",") 
#  ref alt_1 alt_2 alt_3 
# 1: ACTGG  A AATGG NA 
# 2: GGC  G GG NA 
# 3: GC  G NA NA 
# 4: AAT  A AA AAA 
+0

非常感谢!我很欣赏这种解决方案的灵活性。 – soosus

相关问题