【发布时间】:2013-08-15 09:13:26
【问题描述】:
在 data.frame 上使用 apply 时,参数会(隐式)转换为字符。一个例子:
df <- data.frame(v=1:10, t=1:10)
df <- transform(df, t2 = as.POSIXlt(t, origin = "2013-08-13"))
class(df$t2[1])
## [1] "POSIXct" "POSIXt" (correct)
但是:
apply(df, 1, function(y) class(y["t2"]))
## [1] "character" "character" "character" "character" "character" "character"
## [7] "character" "character" "character" "character"
有没有办法避免这种转换?还是我总是必须通过as.POSIXlt(y["t2"]) 转换回来?
编辑
我的 df 有 2 个时间戳(比如 t2 和 t3)和一些其他字段(比如 v1、v2)。对于给定 t2 的每一行,我想找到 t3 最接近但低于 t2(以及相同的 v1)的 k(例如 3)行,并从这些行(例如平均值)返回关于 v2 的统计信息。我写了一个函数 f(t2, v1, df) 并且只想使用apply(df, 1, function(x) f(y["t2"], y["v1"], df) 将它应用于所有行。有没有更好的方法在 R 中做这些事情?
【问题讨论】:
-
这里真正的答案是你不应该在数据框上使用
apply。你想做什么? -
发生了转换,因为您的
data.frame被强制转换为matrix。 -
根据您的编辑,您确实有两个不同的问题 (IMO)。我会用适当的数据集、您尝试过的内容以及您想要的输出来问第二个问题(您的编辑)。
-
我经常需要遍历数据框的行,而
apply是一种获取行和访问列的简单方法。例如。 “从每一行中取出第 1 列和第 4 列,然后对它们进行处理”。有没有更好的方法来实现这一目标?使用apply是否被认为本质上是不好的做法,如果是,为什么? -
@SlowLearner 改写后(谢谢)我意识到stackoverflow.com/questions/2074606/… 回答了我原来的问题