2012-11-29 46 views
1

說我有一個日期的一列的框架:爲什麼變換默默無聞?

test.frame$alt_dates <- c('2001-01-04', '2001-05-11', '2001-05-14', '2001-07-24', '2003-12-24', '2004-07-21', '2004-10-15', '2004-12-15', '2005-03-17', '2005-07-18') 

他們一開始就是個字符。好:

class(test.frame$alt_dates) 
[1] "character" 

如果我嘗試使用變換來使這些日期,日期:

transform(test.frame, alt_dates <- as.Date(alt_dates) 

[R只是打印了我的軀體到控制檯。如果我直接轉換列,它工作正常:

test.frame$alt_dates <- as.Date(test.frame$alt_dates) 
class(test.frame$alt_dates) 
[1] "Date" 

我在做什麼錯誤的變換?

更新:正如一些人注意到的,我沒有把結果分配給任何東西。這就解釋了向屏幕打印和不存儲任何更改。但是,即使我不捕獲結果它不工作:

test.frame <- transform(test.frame, more_dates <- as.Date(more_dates)) 
class(test.frame$more_dates) 
[1] "character" 
+1

您需要將'transform(...)'的結果賦值給一個對象,即'test.frame < - transform(...,...)' – Andrie

回答

5

由於@Andrie和@StephanKolassa說,你需要分配的結果。但是,您在使用transform時出現了另一個錯誤,其中發生了在這種情況下工作,但幾乎在任何其他情況下都會引起您的困擾。在這種情況下,<-=不可互換。您應該使用=transform(在這種情況下,我認爲它的工作原理,因爲測試數據幀只有一個列!)

test.frame <- data.frame(alt_dates=c('2001-01-04', '2001-05-11', '2001-05-14', 
    '2001-07-24', '2003-12-24', '2004-07-21', '2004-10-15', '2004-12-15', 
    '2005-03-17', '2005-07-18')) 
test.frame <- transform(test.frame,alt_dates=as.Date(alt_dates)) 
+0

現在我很尷尬。是的...不分配結果將解釋爲什麼結果打印到控制檯。 – Amanda

+0

有幫助。有更多的專欄,所以它仍然無法使用 - > – Amanda

1

transform()不會失敗。 R使用call by value,即函數的參數僅通過值被傳送-不傳送原始對象test.frame$alt.dates。函數的參數因此不能被函數改變。替代方案call by reference將允許函數在外部範圍中修改其參數。在其他編程語言如C中,通過將「指針」傳遞給內存地址來完成引用調用。不在R.

只需將transform()的結果分配給原始對象。

+2

我可以[承諾](http://cran.r-project.org/doc/manuals/r-release/R-lang.html#Promise-對象)你有些人可能會用價值聲明挑剔你的呼叫。 :)(我同意的精神,但細節變得相當複雜。) – joran

+0

是的,@joran是正確的。我相信這是沿着「通過參考,複製修改」的線路 – Andrie

+0

明白了。我在分配結果時空間很大,但真正的問題似乎是,在一個有多種因素的數據框中,我需要在變換表中使用'=',而不是'<-' – Amanda

相關問題