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

标签 r dataframe apply

使用时 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.framematrix .这个
    意味着将使用限制最少的类。至少
    在这种情况下限制是字符。
  • 您正在供应 1applyMARGIN争论。这适用
    逐行让你更糟,因为你真的在混课
    现在在一起。在这种情况下,您使用的是 apply专为矩阵设计
    和向量上的 data.frames。这不是完成这项工作的正确工具。
  • 在这种情况下,我会使用 lapplysapply正如 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适合工作的家庭。我个人经常使用lapplyfor循环对特定列进行操作或使用索引( [, ] )对我想要的列进行子集,然后继续 apply .这个问题的答案真的归结为确定你想要完成什么,问是apply最合适的工具,然后从那里开始。

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

    关于r - 在数据帧上使用应用时如何避免隐式字符转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18214431/

    相关文章:

    r - 如何阻止使用 lattice 包制作的 R 中的水平图的一部分?

    java - 如何从 Java 运行 R 程序?

    r - 从 plm 固定效应模型中提取方差-协方差矩阵

    python - 查找包含任意列列表中所有字符串列表的数据框行

    python - Dataframe 对象中的拼写更正,Python

    python - Pandas 加速适用于 max()

    r - R 中的并排森林图

    python - 在不删除所有 NaN 的情况下在 python 中融化不完整的数据

    R ave 还是申请?通过具有 strata 变量的函数添加列,但快速且多列

    重复应用不同的列组合