2011-09-07 61 views
2

我正在使用ddply拆分數據幀並將塊發送到函數。在ddply行之前,我設置了i=1。然後在函數內部我遞增i,以便每個數據塊都有一個新的數字。但是,當我運行此功能時,每次調用該功能時,i都將被重置爲1。我認爲這是因爲外部功能i正在重新分配,每次ddply發送一個新的數據塊。有沒有一種方法可以在函數外進行遞增並將數字與數據一起發送?R - ddply並遞增計數器

編輯:: 這裏是主叫用戶線:

rseDF <- ddply(rseDF, .(TestCompound), .fun = setTheSet) 

下面是函數:

##Set The Set Column 
setTheSet <- function(df) { 
if (df[,"TestCompound"] == "DNS000000001") df[,"Set"] <- "Control" 
else {df[,"Set"] <- i 
i <<- i+1} 
return(df) 
} 
+1

這聽起來有些奇怪的事情做'ddply' 。也許如果你擴展一點你的用例並提供一個最小的例子,我們可以建議替代設計模式。 (這聽起來像你真的忙於循環,在這種情況下'ldply'可能更合適?) – Andrie

+0

謝謝安德烈。我實際上沒有使用循環。使用'ddply'的全部原因是爲了消除for循環。該函數只是創建一個列,併爲所有成員放入「i」。據我所知,這是ddply()製作的「Split-Apply-Combine」策略。 – James

回答

5

這僅僅是一個正常的範圍界定問題,即你,如果你堅持這樣的話,需要使用<<-全球分配:

R> library(plyr)     ## load plyr 
R> i <- 1       ## set counter 
R> DF <- data.frame(a=rep(letters[1:3], each=3), b=1:9) 
R> DF        ## boring but simple data frame 
    a b 
1 a 1 
2 a 2 
3 a 3 
4 b 4 
5 b 5 
6 b 6 
7 c 7 
8 c 8 
9 c 9 
R> ddply(DF, .(a), function(x) mean(x$b))  ## summarized 
    a V1 
1 a 2 
2 b 5 
3 c 8 
R> ddply(DF, .(a), function(x) { i <<- i + 1; data.frame(i=i, res=mean(x$b)) }) 
    a i res 
1 a 2 2 
2 b 3 5 
3 c 4 8 
R> 
+0

謝謝德克。我認爲R會爲此提供一個簡單的解決方案,但Google在尋找具體答案時似乎幾乎無用。 – James

+0

快樂 - 另外,如果您通過http://rseek.org網站進行查詢,或者只是添加諸如「r-help」之類的字詞或僅限於gmane.org列表存檔或... –

+1

@ dirk也是,如果您使用Gmail並已登錄,並點擊足夠多的R相關鏈接,它們將會升級爲您的帳戶。當我開始時,我發現很難找到R相關的鏈接,但現在他們幾乎總是處於頂端 – richiemorrisroe

2

你可以使用assign全局變量的值從你的函數中更改:

> x <- 10 

> test1 <- function() { x <- 3 } 
> test1() 
> x 
[1] 10 

> test2 <- function() { assign('x', 3, envir = .GlobalEnv) } 
> test2() 
> x 
[1] 3 

正如你所看到的,test1不會做你期望的,而test2呢。

編輯:更簡潔,我已經通過閱讀說明書發現的方法是使用「超賦值」操作符<<-

> test3 <- function() { x <<- 17 } 
> test3() 
> x 
[1] 17 

手動explains的簡單分配中的語義功能:

請注意,在該功能內完成的任何普通分配都是本地 和臨時的,並在退出該功能後丟失。因此, 分配X <- qr(X)不會影響調用程序中參數的值。