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"
4

2 回答 2

5

正如@Andrie 和@StephanKolassa 所说,您需要分配结果。但是,您在使用transform它时犯了另一个错误,该错误恰好在这种情况下起作用,但在几乎任何其他情况下都会咬到您。<-并且=在这种情况下不可互换。您应该使用=with 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))
于 2012-11-29T20:50:43.840 回答
1

transform()不会失败。R 使用按值调用,即函数的参数仅按值test.frame$alt.dates传输 -不传输原始对象。因此,函数的参数不能被函数更改。另一种方法,按引用调用,将允许函数在外部范围内修改其参数。在其他编程语言(如 C)中,引用调用是通过将“指针”传递给内存地址来完成的。不在 R 中。

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

于 2012-11-29T20:53:40.573 回答