【问题标题】:How to pass multiple arguments to existing functions while using ddply?使用ddply时如何将多个参数传递给现有函数?
【发布时间】:2015-03-13 21:27:19
【问题描述】:

我看到很多类似的问题,但没有什么能很好地暗示如何解决我的具体问题。我有一个数据框(很好地融合了),其中包括两个因子列和两列,我想用它们提供一个有两个参数的函数。我想基本上做 ddply 所做的事情,因为它会为两个因素组合中的每一个提供两个参数给函数。在我的例子中,函数“ros”(包“CensReg”)的第二个参数属于“logical”类,所以我创建了一组虚拟的 True 或 False 标记来与数字数据一起使用。

df <- data.frame(f1=c(rep("A",5), rep("B",5), rep("C",5)), f2=c(rep("Yes",10), rep("No",5)), d1=c(2,2,2,rnorm(12,9)), d2=(c(rep("TRUE",3),rep("FALSE",12))=="TRUE"))

我正在尝试做这样的事情:

ddply(.data = df, .variables = .(f1, f2), function(x,y) ros(d1, d2))

我对 ddply 有什么遗漏可以防止这种情况发生吗?我收到错误“错误:找不到对象'd1'”。 ros函数的输出类如下:

class(ros(x,y))
[1] "ros" "lm" 

如果这弄乱了 ddply,我可以看到从函数中提取我需要的东西,类似于从线性回归中提取系数:

ddply(.data = df, .variables = .(f1, f2), function(x,y) mean = mean(ros(d1, d2)))

(相信我,您可以调用 mean(ros(.....)) 并返回一个值;基本上,它对具有“审查”数据点(低于测试检测限)的数据集进行稳健回归,并让您计算可以使用“均值”、“中位数”等手动调用的汇总统计信息)

任何关于如何将两个 d1 和 d2 参数传递给 ddply 中的函数的指导都可以继续进行!

【问题讨论】:

    标签: r plyr


    【解决方案1】:

    在没有嵌套函数的情况下使用summarizetransform

    ddply(.data = df, .variables = .(f1, f2),summarize,ros(d1,d2))
    

    或者如果你想使用嵌套函数,你应该创建一个包含分组元素的单个参数(data.frame):

    ddply(.data = df, .variables = .(f1, f2),function(x)ros(x$d1,x$d2))
    

    揭秘这一点的一个提示是使用browser 来检查参数:

    ddply(.data = df, .variables = .(f1, f2),function(x)browser())
    

    现在,如果您检查 x,您可以验证它是一个 data.frame:

    Browse[1]> x
    
    #    f1  f2       d1    d2
    # 1  A Yes 2.000000  TRUE
    # 2  A Yes 2.000000  TRUE
    # 3  A Yes 2.000000  TRUE
    # 4  A Yes 7.448215 FALSE
    # 5  A Yes 8.599762 FALSE
    

    【讨论】:

    • 谢谢!您发布的第二个代码在我将其更改为 dlply 后工作,因为 ros 的摘要是一个列表。
    猜你喜欢
    • 1970-01-01
    • 2016-01-17
    • 2023-04-04
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-01
    相关资源
    最近更新 更多