Получение имен индексов от объекта by путем анализа его вызова - PullRequest
2 голосов
/ 11 октября 2011

Я пытаюсь создать метод as.data.frame.by, который в основном плавит N-мерное по объекту для использования с latex.table.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))

Я просто хочу использовать имена индексов, но я понятия не имею, какчтобы разбирать этого монстра.Идеи?

Ответы [ 3 ]

1 голос
/ 11 октября 2011

Если вы делаете вызов с именованными аргументами, вы получаете димны, как и ожидалось:

> 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)
1 голос
/ 11 октября 2011

Это будет работать для приведенного примера:

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

tail(..., 1)[[1]] захватывает list(Time,Chick,Diet) и [-1] сбрасывает list.

0 голосов
/ 11 октября 2011

Хм, дикое предположение о attr(my.by,"call")[["INDICES"]], кажется, производит языковой объект.

И принуждение к характеру работает на удивление хорошо:

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

Так что я мог бы, вероятно, взять его оттуда, хотя он будет сильно зависеть от того, как пользователь его указывает. Лучшие идеи разбора будут наиболее цениться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...