2014-05-05 32 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

相關問題