使用时 apply
在 data.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 的每一行,我想找到 k(例如 3)行 t3 最接近但低于 t2(和相同的 v1),并从这些行返回 v2 的统计数据(例如平均值)。我写了一个函数 f(t2, v1, df) 并且只想使用
apply(df, 1, function(x) f(y["t2"], y["v1"], df)
将它应用于所有行.有没有更好的方法在 R 中做这样的事情?
最佳答案
让我们将多个评论包装成一个解释。
apply
的使用转换 data.frame
到 matrix
.这个意味着将使用限制最少的类。至少
在这种情况下限制是字符。
1
至 apply
的 MARGIN
争论。这适用逐行让你更糟,因为你真的在混课
现在在一起。在这种情况下,您使用的是
apply
专为矩阵设计和向量上的 data.frames。这不是完成这项工作的正确工具。
lapply
或 sapply
正如 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
适合工作的家庭。我个人经常使用lapply
或 for
循环对特定列进行操作或使用索引( [, ]
)对我想要的列进行子集,然后继续 apply
.这个问题的答案真的归结为确定你想要完成什么,问是apply
最合适的工具,然后从那里开始。我可以提供这个blog post作为关于不同之处的优秀教程
apply
函数族做。
关于r - 在数据帧上使用应用时如何避免隐式字符转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18214431/