2011-10-11 84 views
2

我试图创建一个as.data.frame.by方法,该方法基本上融合了N维的对象以便与latex.table.by一起使用。通过解析其调用获取来自对象的索引名称

融化它非常简单,因为by对象只是一个矩阵,但是返回的变量名是最不具有描述性的“X”的想象。

dat <- transform(ChickWeight, Time=cut(Time,3), Chick=cut(as.numeric(Chick),3)) 
my.by <- by(dat, with(dat,list(Time,Chick,Diet)), function(x) sum(x$weight)) 

翻翻attributes(my.by)任何地方都不会透露的变量名都存储除了呼叫的指数。我想默认为表格合理描述。

使叶片解析电话:

> attr(my.by,"call") 
by.data.frame(data = dat, INDICES = with(dat, list(Time, Chick, 
    Diet)), FUN = function(x) sum(x$weight)) 
> str(attr(my.by,"call")) 
language by.data.frame(data = dat, INDICES = with(dat, list(Time, Chick,  Diet)), FUN = function(x) sum(x$weight)) 

我只是想使用的索引的名字,但我不知道如何去分析这个怪物。想法?

回答

1

如果你与命名参数你dimnames电话,你希望:

> my.by <- with(dat, by(weight, list(Time=Time,Chick=Chick,Diet=Diet), sum)) 
> str(my.by) 
by [1:3, 1:3, 1:4] 3475 5969 8002 640 1596 ... 
- attr(*, "dimnames")=List of 3 
    ..$ Time : chr [1:3] "(-0.021,6.99]" "(6.99,14]" "(14,21]" 
    ..$ Chick: chr [1:3] "(0.951,17.3]" "(17.3,33.7]" "(33.7,50]" 
    ..$ Diet : chr [1:4] "1" "2" "3" "4" 
- attr(*, "call")= language by.default(data = weight, INDICES = list(Time = Time, Chick = Chick,  Diet = Diet), FUN = sum) 
+0

不错。回想起来似乎很简单。谢谢! –

0

嗯,野生猜测attr(my.by,"call")[["INDICES"]]似乎产生一个语言对象。

并强迫该字符的作品出奇地好:

> as.character(attr(my.by,"call")[["INDICES"]]) 
[1] "with"     "dat"      "list(Time, Chick, Diet)" 

所以我大概可以从那里抓住它,尽管它仍然高度依赖于用户如何指定它。更好的解析想法将是最赞赏。

1

这将对于给出的示例工作:

as.character(tail(as.list(attr(my.by, 'call')[['INDICES']]), 1) [[1]]) [-1] 

tail(..., 1)[[1]]抓起list(Time,Chick,Diet),并且[-1]下降list