ang*_* mo 14 r apply dataframe
在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的每一行,我想找到k(例如3)行,其中t3最接近但小于t2(和相同的v1),并从这些行返回v2的统计量(例如平均值).我写了一个函数f(t2,v1,df),只是想在所有行上使用它apply(df, 1, function(x) f(y["t2"], y["v1"], df).在R中有没有更好的方法来做这些事情?
让我们将多条评论包含在一个解释中.
apply转换a data.frame到a 的用法matrix.这意味着将使用限制性最小的类.在这种情况下,限制最少的是角色.1给apply的MARGIN说法.这适用于行并且让你更糟糕,因为你现在真的在一起混合课程.在这种情况下,您使用的apply是为矢量上的矩阵和data.frame设计的.这不适合这项工作.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循环来操作特定的列或使用indexing([, ])对我想要的列进行子集,然后继续apply.这个问题的答案实际上归结为确定你想要完成什么,询问是apply最合适的工具,并从那里开始.
我可以提供这篇博文作为关于不同apply函数系列的优秀教程.