在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的每一行,我想找到k(例如3)行,其中t3最接近但低于t2(和相同的v1),并从这些行返回v2的统计量(例如平均值)。我写了一个函数f(t2,v1,df),只想用apply(df, 1, function(x) f(y["t2"], y["v1"], df)
将它应用于所有行。在R中有没有更好的方法来做这些事情?
答案 0 :(得分:5)
让我们将多条评论结合到一个解释中。
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
系列函数的优秀教程。
答案 1 :(得分:0)
尝试:
sapply(df, function(y) class(y["t2"]))
$v
[1] "integer"
$t
[1] "integer"
$t2
[1] "POSIXct" "POSIXt"