ddply: как включить символьный вектор в результат - PullRequest
5 голосов
/ 06 января 2012

извините, из-за загадочного названия я не нашел лучшего резюме по моей проблеме. Итак, вот моя проблема: у меня есть датафрейм и я хочу создать diff() для групп, что работает нормально:

 df <- data.frame (name = rep(c("a", "b", "c"), 4),
              index = rep(c("c1", "c2"), each=6),
              year = rep(c(2008:2010),4),
              value = rep(1:3, each=4))

head(df)

  name index year value

1    a    c1 2008     1
2    b    c1 2009     1
3    c    c1 2010     1

ddply(df, .(name, year), summarize,  value=diff(value))

Однако я хотел бы включить index в свой результат, который я пытался сделать с:

ddply(df, .(name, year), summarize,  value=diff(value), index=index)

Все же это приводит к сообщению об ошибке:

length(rows) == 1 is not TRUE

Что я и думаю, потому что в индексе больше строк, потому что он не обработан diff. Есть ли быстрое решение моей проблемы?

Большое спасибо!

EDIT

Я пытаюсь уточнить свой вопрос, что я хочу добавить к результату:

Предположим, переменная index выше. Это фактор, который должен что-то объяснять. Тем не менее, я не могу взять diff() этого, что не имело бы смысла, поэтому я просто хочу пропустить это, не меняя ничего. Я попытался drop==FALSE, который привел к тому же сообщению об ошибке.

Извините за все это замешательство! Вот очень простой пример:

name year  index  value
 a   2008    c1    10
 a   2009    c2    30
 a   2010    c1    40

после взятия группы acroos diff 'a' это выглядит так:

name year index d.value 
 a   2009  c2     +20  #c2 stayed the same just the first row got intentionally dropped.
 a   2010  c1     +10

считают несчастное имя index чем-то вроде атрибута: оно может меняться годами, но не имеет смысла принимать diff()

Я действительно очень надеюсь, что это даст вам подсказку, чего я хочу - если нет, я удалю вопрос, потому что я нашел нелегкий обходной путь;) и извините за все неудобства!

1 Ответ

2 голосов
/ 17 января 2012

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

doSummary = function(df) {
  values = diff(df$value)
  indexes = df$index[2:length(df)]
  data.frame(d.value=values, index=indexes)
}
ddply(df, .(name, year), doSummary)
...