在数据帧上使用apply时如何避免隐式字符转换

时间:2013-08-13 16:30:21

标签: r dataframe apply

在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中有没有更好的方法来做这些事情?

2 个答案:

答案 0 :(得分:5)

让我们将多条评论结合到一个解释中。

  1. 使用apply会将data.frame转换为matrix。这个 意味着将使用限制性最小的类。至少 在这种情况下限制性质。
  2. 您正在向1提出apply MARGIN个参数。这适用 因为你正在混合课程,所以你会更糟糕 现在一起在这种情况下,您使用的是为apply设计的矩阵 和矢量上的data.frames。这不适合这项工作。
  3. 在这种情况下,我会使用lapplysapply作为rmk指出来抓住类 单个t2列如下所示:
  4. 代码:

    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家庭。我个人经常使用lapplyfor循环来处理特定列或使用索引([, ])对我想要的列进行子集化,然后继续apply。这个问题的答案实际上归结为确定你想要完成什么,问apply最合适的工具,然后从那里开始。

    我可以提供这个blog post作为关于不同apply系列函数的优秀教程。

答案 1 :(得分:0)

尝试:

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

$v
[1] "integer"

$t
[1] "integer"

$t2
[1] "POSIXct" "POSIXt"