Сомнения по поводу функции ddply в R

Я пытаюсь сделать эквивалентную group by сводку в R через функцию plyr с именем ddply. У меня есть фрейм данных с тремя столбцами (скажем, id, period и event). Затем я хотел бы подсчитать, сколько раз каждый id появляется во фрейме данных (count(*)... group by id с SQL) и получить последний элемент каждого id, соответствующий столбцу event.

Вот пример того, что у меня есть и что я пытаюсь получить:

  id period event #original data frame
  1      1     1
  2      1     0
  2      2     1
  3      1     1
  4      1     1
  4      1     0

  id  t  x #what I want to obtain
  1   1  1
  2   2  1
  3   1  1
  4   2  0

Это простой код, который я использовал для этого:

 teachers.pp<-read.table("http://www.ats.ucla.edu/stat/examples/alda/teachers_pp.csv", sep=",", header=T) # whole data frame
 datos=ddply(teachers.pp,.(id),function(x) c(t=length(x$id), x=x[length(x$id),3])) #This is working fine.

Я прочитал Стратегию разделения-применения-объединения для анализа данных и понял приведен пример, в котором они использовали синтаксис, эквивалентный тому, который я привел ниже:

  datos2=ddply(teachers.pp,.(id), summarise, t=length(id), x=teachers.pp[length(id),3]) #using summarise but the result is not what I want. 

Это кадр данных, который я получаю, используя datos2

  id  t  x
  1   1  1
  2   2  0
  3   1  1
  4   1  1

Итак, мой вопрос: почему этот результат отличается от того, который я получаю, используя первый фрагмент кода, я имею в виду datos1? Что я делаю неправильно?

Мне непонятно, когда я должен использовать summarise или transform. Не могли бы вы сказать мне правильный синтаксис для функции ddply?


person nhern121    schedule 25.07.2012    source источник
comment
Используя вашу вторую версию, моя колонка для t гласит: 1, 2, 1, 2. Опечатка или это действительно то, что печатает ваша машина?   -  person sebastian-c    schedule 26.07.2012
comment
Нет, это результат, который распечатывает мой компьютер. 1,2,1,1. Спасибо!   -  person nhern121    schedule 26.07.2012


Ответы (1)


При использовании summarise перестаньте ссылаться на исходный фрейм данных. Вместо этого просто напишите выражения в терминах имен столбцов.

Вы пробовали это:

ddply(teachers.pp,.(id), summarise, t=length(id), x=teachers.pp[length(id),3])

когда то, что вы, вероятно, хотели, было чем-то вроде этого:

ddply(teachers.pp,.(id), summarise, t=length(id), x=tail(event,1))
person joran    schedule 25.07.2012