2013-06-04 112 views
1

我在重新整形數據時遇到問題;以下是我擁有的示例數據集。與多個表合併

x<-data.frame(SN=rep(1:4,c(3,3,4,4)),value=1:14,F=rep(c(LETTERS[1:4]), each = 1, len = 14)) 

我需要重新創建含有唯一SN數據的列的數據,然後在'value'中爲該SN指定列名以標識SN。最後,我需要將它們合併在一起。

我想下面的輸出:

F 1 2 3 4  
A 1 5 9 13 
B 2 6 10 14 
C 3 NA 7 11 
D NA 4 8 12 

我的數據的結構是:

SN : Chr "1.1", 100.1", "100.5" ... 
F: Factor w/24 levels ... 
value: num ... 

謝謝您的幫助!

+0

這兩個示例都沒有生成錯誤,但都由於重複列名而生成警告。你能否準確描述你的預期產出是什麼? – joran

+0

@joran和所有,我編輯了這個問題。感謝您提供幫助。 – Bhante

回答

1

同樣,與其他海報我非常不確定的,你問什麼,但這是我的你正在嘗試做的解釋:

require(reshape2) 
dcast(x , F ~ SN , value.var = "value") 
# F 1 2 3 4 
#1 A 1 5 9 13 
#2 B 2 6 10 14 
#3 C 3 0 7 15 
#4 D 0 4 8 12 

獨特的SN是列名,行是F並且這些值是在值列中找到的相應值。但是,如果SN-F組合有多個值(對於SN = 4和F = C,其中有11和15),則需要max值。

HTH

0

我不知道如果我得到你的任務,但我希望此代碼的工作:

x<-data.frame(SN=rep(1:4,c(3,3,4,5)),value=1:15,F=rep(c(LETTERS[1:4]), each = 1, len = 15)) 

SN<-unique(x$SN) 
for (i in 1:length(SN)){ 
    xi<-x[x$SN==SN[i],] 
    colnames(xi)[2]<-paste("SN",i,sep=".") 
    xi<-xi[,c(3,2)] 
    if (i==1){x_all<-xi} 
    if (i>1){ 
    x_all<-merge(x_all,xi,by="F") 
    } 
} 
head(x_all) 
+0

感謝您的幫助。我很抱歉沒有更清楚地表明。我真正的數據集中的SN不僅是數字,所以我不能在合併之前使用邏輯運算符。 – Bhante

1

我做了這個漂亮的一味只是想自動化您的手動過程,但我認爲它的工作原理。如果你的數據相當大,那麼肯定有辦法提高make.sub()函數的速度,但我猜測這對你來說不是問題。

#make funciton to make your subsets 
make.sub <- function(sn){ 
    tmp <- x[x$SN==sn,] 
    names(tmp)[2] <- sn 
    return(tmp) 
} 

#apply function to get list of subsets 
x.list <- lapply(unique(SN), make.sub) 

#merge list of subsets 
x.merged <- Reduce(function(...) merge(..., by="F"), x.list) 

正如您所看到的,這給出了與手動過程相同的結果。

> x.merged 
    F SN.x 1 SN.y 2 SN.x 3 SN.y 4 
1 A 1 1 2 5 3 9 4 13 
2 B 1 2 2 6 3 10 4 14 
> x_all 
    F SN.x 1 SN.y 2 SN.x 3 SN.y 4 
1 A 1 1 2 5 3 9 4 13 
2 B 1 2 2 6 3 10 4 14 
+1

使用'x.list = split(x,x $ SN)'代替 – eddi

+0

絕對是一種比我寫的雜亂函數更清潔的方法,但由於我並不真正瞭解最終目標,所以我想確保更改第二個變量名稱如手冊中所示。 – David

+0

@大衛,它在上述數據集中工作正常。但是,當我在我的數據中應用時,它會給出以下錯誤: fix.by(by.x,x)中的錯誤:'by'必須指定唯一有效的列 – Bhante