【问题标题】:Why does transform fail silently?为什么转换会默默失败?
【发布时间】:2012-11-29 20:46:56
【问题描述】:

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

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"

Transform 做错了什么?

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

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

【问题讨论】:

  • 你需要将transform(...)的结果赋给一个对象,即test.frame &lt;- transform(..., ...)

标签: r transform


【解决方案1】:

正如@Andrie 和@StephanKolassa 所说,您需要分配结果。但是,您在使用transform 时犯了另一个错误,碰巧 在这种情况下工作,但在几乎任何其他情况下都会咬到你。 &lt;-= 在这种情况下不可互换。您应该将=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))

【讨论】:

  • 现在我很尴尬。是的......不分配结果将解释为什么结果打印到控制台。
  • 很有帮助。有更多的列,所以它仍然无法使用 ->
【解决方案2】:

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

只需将transform() 的结果赋给原始对象即可。

【讨论】:

  • 我可以promise 你,有些人可能会通过价值声明来挑剔你的电话。 :)(我在精神上同意,但细节变得相当复杂。)
  • 是的,@joran 是正确的。我相信这类似于“通过引用传递,修改时复制”
  • 知道了。我在分配结果时很犹豫,但真正的问题似乎是在具有多个因素的数据框中,我需要在我的转换语句中使用=,而不是&lt;-
猜你喜欢
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多