【问题标题】:An efficient way to grow a data frame using a by function使用 by 函数增长数据帧的有效方法
【发布时间】:2012-12-15 06:36:12
【问题描述】:

我需要对由ID 识别的车辆进行一些分析。此分析的结果将包括一些numericfactorlogical 信息。分析中用到的所有数据都在一个数据框中,所以函数是这样的:

Results <- by(Data, Data$ID, Function)

Function 旨在提供如下输出:

Function <- function(DF) {
                          ## Do stuff...
                          return(c(23.2, as.factor("SuperFast"), TRUE))
                         }

到目前为止,这种方法的优点在于,除了速度非常快(大约 1 分钟,for 循环需要几个小时)之外,还可以通过以下方式轻松输入data.frame 格式:

as.data.frame(do.call("rbind", Results))

当然,Function 中的c "rbind" 中的do.call 将所有内容强制转换为相同的对象类型。为了解决这个问题,我一直在让Function 吐出一个字符向量(比如as.character(23.2, "SuperFast", TRUE),然后在最后手动更改对象类型。

是否有 (1) 一种方法可以在具有不同对象类型的数据框中返回 row,或者 (2) 比使用 byc(对于行)更好的方法?

只是为了好玩,这里有一些可以用于数据的东西:

Data <- data.frame(ID=c(1,2,2,3))

【问题讨论】:

    标签: r


    【解决方案1】:

    只需从您的函数中返回一个数据框而不是一个向量:

    Function <- function(DF) {
        ## Do stuff...
        return(data.frame(a = 23.2,b = as.factor("SuperFast"),c = TRUE))
    }
    

    顺便说一句,将所有内容强制为相同数据类型的唯一方法是crbind 有一个数据框方法,它将(大部分)保留类型,假设您传递给它的所有数据框都排成一行。

    【讨论】:

    • 谢谢 - 错过这一点感觉很愚蠢,但我很高兴这很简单。我想我以前试图避免使用这样的方法,因为我在 rbinding 使用不同的 colnames 的东西,但由于这一切都来自同一个功能,它应该可以完美地工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 2018-05-24
    • 2019-10-05
    相关资源
    最近更新 更多