假设我有一个包含日期列的框架:
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"
答案 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()
的结果分配给原始对象。