2014-02-10 23 views
1

例如的領域,我有一個表如下:(讓我們把它叫做)創建一個新的列,其名字是從表

SNP   ID ALLE1 ALLE2 
SNPNAME1 1  A  A 
SNPNAME2 1  A  G 
SNPNAME3 1  G  G 
... 

我想編寫一個函數來創建一個新表從上面:

ID SNPNAME1 SNPNAME2 SNPNAME3... 
1 AA  AG   GG 
... 

所以我的想法是先創建一個空對象b,然後我添加了一個新列「ID」來了,我可以做如下:

b$ID=NA 

然後我嘗試添加一個新的列,其名稱是從a[1,]$SNP,我想這個通過了如下聲明:

b$a[1,]$SNP=NA 

但是我不能。 然後我試圖使用

b$get(a[1,]$SNP)=NA 

c=quote(a[1,]$SNP) 
b$eval(c)=NA 

但上述所有沒有現在的工作。 誰能告訴我如何做到這一點? 謝謝。

回答

1

有沒有必要自己建立一個對象。首先,讓我們做,我認爲是代表您的具體情況的一些示例數據:

df = data.frame(name = paste('spam', rep(1:10, 5), sep = ''), 
       ID = rep(1:5, each = 10), 
       var1 = sample(c('A', 'G'), 50, replace = TRUE), 
       var2 = sample(c('A', 'G'), 50, replace = TRUE)) 

AMD結合了var列:

df = transform(df, comb_var = paste(var1, var2, sep = '')) 
head(df) 
    name ID var1 var2 comb_var 
1 spam1 1 A G  AG 
2 spam2 1 G G  GG 
3 spam3 1 G G  GG 
4 spam4 1 A G  AG 
5 spam5 1 A G  AG 
6 spam6 1 G A  GA 

然後用dcast執行轉換:

library(reshape2) 
dcast(df, ID ~ name, value.var = 'comb_var') 
    ID spam1 spam10 spam2 spam3 spam4 spam5 spam6 spam7 spam8 spam9 
1 1 AG  GA GG GG AG AG GA GG GA GG 
2 2 AA  GA AG GA GA AG AG AA GG AG 
3 3 GG  AG AG AG GA GG GA GA AA AG 
4 4 AA  AA GA GA GA GA AA GA AG AA 
5 5 AG  AA GA AA GG GG GG GA GG GG 
2

這是data.table解決方案。

library(data.table) 

DT <- data.table(a) 
DT[, setNames(as.list(paste0(ALLE1, ALLE2)), SNP), by = ID] 

## ID SNPNAME1 SNPNAME2 SNPNAME3 
## 1: 1  AA  AG  GG 

利用保羅的數據

DT <- data.table(df) 
DT[, structure(as.list(paste0(var1, var2)), names = as.character(name)), by = ID] 

## ID spam1 spam2 spam3 spam4 spam5 spam6 spam7 spam8 spam9 spam10 
## 1: 1 AA AA GA GG AG GA GA AG GG  AA 
## 2: 2 AA AA GA GA GA AA AG GG GG  GG 
## 3: 3 AG AG AG GA AA AG GG GA AG  AA 
## 4: 4 GA GG GA AA AG GG AA AA GG  AG 
## 5: 5 AG GA GG AG AA AG AA AA GG  GA 
+0

我沒有發現名稱是正確的所以也許你會考慮這個小修改:'DT [,setNames(as.list(paste0(ALLE1,ALLE2)),SNP),by = ID]'。也許在4年間data.table處理列表的方式發生了變化,但我認爲'names = SNP'應該是'.Names = SNP',但即使在我的機器上失敗了。 –

+0

@BonddedDust謝謝。 'data.table'必定會有一些變化。下次只需編輯它:) –

1
DF <- read.table(text="SNP   ID ALLE1 ALLE2 
SNPNAME1 1  A  A 
SNPNAME2 1  A  G 
SNPNAME3 1  G  G", header=TRUE) 

library(reshape2) 

DFm <- melt(DF, id=c("SNP", "ID")) 
dcast(DFm, ID~SNP, value.var="value", fun.aggregate=paste, collapse="") 
# ID SNPNAME1 SNPNAME2 SNPNAME3 
#1 1  AA  AG  GG 
1

每當我看到reshape2答案,我總是試圖看看是否有一個相當簡單的基礎R解決方案。在這種情況下(使用保羅的數據)使用tapply()I()似乎重新排列表格排列的字符串(如果先防止'作出的一個因素變換):

df = transform(df, comb_var = paste(var1, var2, sep = ''),stringsAsFactors=FALSE) 
with(df, tapply(comb_var, list(ID, name), I)) 
#-------------------- 
    spam1 spam10 spam2 spam3 spam4 spam5 spam6 spam7 spam8 spam9 
1 "AA" "GA" "GG" "GG" "GA" "AG" "AA" "GG" "GG" "AG" 
2 "AA" "AG" "AA" "AA" "AA" "GG" "GG" "AA" "AA" "GG" 
3 "GA" "GA" "GA" "AG" "AA" "AG" "GA" "GG" "AG" "AG" 
4 "GG" "AA" "GG" "GG" "AA" "GA" "GA" "GG" "AA" "AA" 
5 "AG" "GA" "AG" "GG" "GA" "GA" "AG" "AA" "GG" "GG" 
相關問題