15

applydata.frame 上使用时,参数(隐式)转换为字符。一个例子:

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 的 k(例如 3)行(以及相同的 v1),并从这些行返回 v2 的统计信息(例如平均值)。我写了一个函数 f(t2, v1, df) 并且只是想将它应用到所有使用apply(df, 1, function(x) f(y["t2"], y["v1"], df). 有没有更好的方法在 R 中做这些事情?

4

2 回答 2

7

让我们将多个评论总结为一个解释。

  1. 的使用apply将 a 转换data.frame为 a matrix。这意味着将使用限制最少的类。在这种情况下,限制最少的是字符。
  2. 你提供1apply' 的MARGIN论点。这按行适用,并且会使您的情况变得更糟,因为您现在确实将课程混合在一起。在这种情况下,您使用apply的是为向量上的矩阵和 data.frames 设计的。这不是工作的正确工具。
  3. 在这种情况下,我会使用lapplyorsapply作为 rmk 指出来获取单个 t2 列的类,如下所示:

代码:

df <- data.frame(v=1:10, t=1:10)
df <- transform(df, t2 = as.POSIXlt(t, origin = "2013-08-13"))

sapply(df[, "t2"], class)
lapply(df[, "t2"], class)

## [[1]]
## [1] "POSIXct" "POSIXt" 
## 
## [[2]]
## [1] "POSIXct" "POSIXt" 
## 
## [[3]]
## [1] "POSIXct" "POSIXt" 
## 
## .
## .
## . 
## 
## [[9]]
## [1] "POSIXct" "POSIXt" 
## 
## [[10]]
## [1] "POSIXct" "POSIXt" 

一般来说,你会选择apply适合这份工作的家庭。通常我个人使用lapplyorfor循环来处理特定列或使用索引 ( [, ]) 对我想要的列进行子集处理,然后继续apply. 这个问题的答案真的归结为确定你想要完成什么,问是apply最合适的工具,然后从那里开始。

我可以将这篇文作为一个很好的教程来介绍不同apply的函数系列的作用。

于 2013-08-13T16:47:59.857 回答
1

尝试:

sapply(df, function(y) class(y["t2"]))

$v
[1] "integer"

$t
[1] "integer"

$t2
[1] "POSIXct" "POSIXt"
于 2013-08-13T16:33:40.300 回答