【问题标题】:Extract information from conditional formula从条件公式中提取信息
【发布时间】:2010-03-11 17:41:29
【问题描述】:

我想编写一个接受公式作为其第一个参数的 R 函数,类似于 lm() 或 glm() 和朋友。在这种情况下,它是一个函数,它接受一个数据帧并以SVMLight 格式写出一个文件,其一般形式如下:

<line> .=. <target> <feature>:<value> <feature>:<value> ... <feature>:<value> # <info>
<target> .=. +1 | -1 | 0 | <float> 
<feature> .=. <integer> | "qid"
<value> .=. <float>
<info> .=. <string>

例如下面的数据框:

  result qid     f1     f2     f3     f4   f5     f6     f7     f8
1     -1   1 0.0000 0.1253 0.0000 0.1017 0.00 0.0000 0.0000 0.9999
2     -1   1 0.0098 0.0000 0.0000 0.0000 0.00 0.0316 0.0000 0.3661
3      1   1 0.0000 0.0000 0.1941 0.0000 0.00 0.0000 0.0509 0.0000
4     -1   2 0.0000 0.2863 0.0948 0.0000 0.34 0.0000 0.7428 0.0608
5      1   2 0.0000 0.0000 0.0000 0.4347 0.00 0.0000 0.9539 0.0000
6      1   2 0.0000 0.7282 0.9087 0.0000 0.00 0.0000 0.0000 0.0355

将表示如下:

-1 qid:1 2:0.1253 4:0.1017 8:0.9999
-1 qid:1 1:0.0098 6:0.0316 8:0.3661
1  qid:1 3:0.1941 7:0.0509
-1 qid:2 2:0.2863 3:0.0948 5:0.3400 7:0.7428 8:0.0608
1  qid:2 4:0.4347 7:0.9539
1  qid:2 2:0.7282 3:0.9087 8:0.0355

我想写的函数会是这样的:

write.svmlight(result ~ f1+f2+f3+f4+f5+f6+f7+f8 | qid, data=mydata, file="out.txt")

甚至

write.svmlight(result ~ . | qid, data=mydata, file="out.txt")

但我不知道如何使用model.matrix() 和/或model.frame() 来知道它应该写哪些列。这些是值得关注的事情吗?

非常感谢任何帮助!

【问题讨论】:

    标签: r formula


    【解决方案1】:

    部分答案。您可以下标公式对象以获取公式的解析树:

    > f<-a~b+c|d
    > f[[1]]
    `~`
    > f[[2]]
    a
    > f[[3]]
    b + c | d
    > f[[3]][[1]]
    `|`
    > f[[3]][[2]]
    b + c
    > f[[3]][[3]]
    d
    

    现在你只需要代码来遍历这棵树。

    更新:这是一个遍历树的函数示例。

    walker<-function(formu){
      if (!is(formu,"formula"))
        stop("Want formula")
      lhs <- formu[[2]]
      formu <- formu[[3]]
    
      if (formu[[1]]!='|')
        stop("Want conditional part")
    
      condi <- formu[[3]]
    
      flattener <- function(f) {if (length(f)<3) return(f);
                                c(Recall(f[[2]]),Recall(f[[3]]))}
      vars <- flattener(formu[[2]])
    
      list(lhs=lhs,condi=condi,vars=vars)
    }
    
    walker(y~a+b|c)
    

    另请参阅 terms.formulaterms.object 的文档。查看一些采用条件公式的函数的代码会有所帮助,例如。 lme4 包中的 lmer 函数。

    【讨论】:

    • 嘿 - 是的,走树确实是“我所需要的一切”。 =) 我确实看过 lmer(),但我需要获取源代码包,因为它的 lmerFrames() 方法(似乎进行解析)是隐藏的。或者有没有办法像这样查看 S4 方法的代码?
    • 好的,现在查看lmerFrames() 等的源代码。真恶心。我想我一直认为有一些更巧妙的方式来操作公式。
    • 您可以使用 ::: 来引用命名空间中的非导出函数,例如。 lme4:::lmerFrames。更新了我的答案以包含一个遍历树的函数,目前没有做太多的输入检查。
    【解决方案2】:

    我用过

    formu.names <- all.vars(formu)
    Y.name <- formu.names[1]
    X.name <- formu.names[2]
    block.name <- formu.names[3]
    

    在我写的关于为 Friedman 测试做事后处理的代码中:

    http://www.r-statistics.com/2010/02/post-hoc-analysis-for-friedmans-test-r-code/

    但它只适用于:Y`X|block

    希望其他人能给出更好的答案。

    【讨论】:

      猜你喜欢
      • 2020-01-25
      • 2022-10-19
      • 1970-01-01
      • 2018-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多