为什么变换无声地失败?

时间:2012-11-29 20:46:56

标签: r transform

假设我有一个包含日期列的框架:

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将这些日期变为日期:

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"

我对Transform的错误是什么?

更新:正如一些人注意到的那样,我没有把结果分配给任何东西。这样就解释了打印到屏幕并且没有存储任何更改。但即使我抓住结果它也不起作用:

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

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:1)

transform()不会失败。 R使用call by value,即函数的参数仅按值传输 - 不传输原始对象test.frame$alt.dates。因此,函数不能更改函数的参数。替代方法call by reference将允许函数在外部作用域中修改其参数。在诸如C的其他编程语言中,通过将“指针”传递给存储器地址来完成通过引用的调用。不在R。

只需将transform()的结果分配给原始对象。