R - бин в соответствии с фактором - PullRequest
1 голос
/ 08 марта 2019

У меня есть набор данных, в котором я хотел бы запустить classIntervals(df$vol, 3, style="jenks") для каждой группы и комбинации типов в нем.

Данные выглядят примерно так.

data_sam <- data.frame( "group"=c( "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A",
  "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A",
  "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A"
  ), "type"=c( "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A",
  "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B",
  "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B" ), "index"=c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59
  ), "vol"=c(52,272,374,408,498,480,451,644,715,659,820,713,810,676,840,589,594,998,782,483,351,494,377,261,637,379,706,530,619,724,333,189,246,82,39,85,159,143,125,118,79,39,110,190,264,101,70,46,0,27,71,69,172,464,132,0,156,167,142,45,51,10,0,14,67,20,2,12,1,0,6,2,2,17,22,7,0,2,9,5,12,15,7,0,12,18,4,3,12,9,12,13,14,8,9,11,10,5,4,1,4,10,4,4,3,5,5,1,3,0,2,3,2,4,2,3,3,0,0,1,1,1,0,0,1,1,2,0,1,1,0,1,1,0,0,1,0,0,0,0,1,2,0,1,1
  ))

Я бы хотелхотелось бы видеть результаты группы по типу группы.

Согласно приведенным выше данным, следующие результаты - это то, что я должен получить при запуске classIntervals:

группа A - тип A

style: jenks
one of 2,628 possible partitions of this variable into 3 classes
[0,190]     (190,530]   (530,998] 
53          17          16 

группа A - тип B

style: jenks
one of 66 possible partitions of this variable into 3 classes
[0,2]   (2,5]   (5,14] 
34      15      10 

Есть ли способ, которым я могу перебрать типы групп в пределах data_sam для корзин?И, в идеале, просматривать результаты в формате data.frame следующим образом.

group type count1 count2 count3 boundary1 boundary2 boundary3 A A 53 17 16 [0,190] (190,530] (530,998] A B 34 15 10 [0,2] (2,5] (5,14]

В качестве альтернативы, я рад видеть даже разрывы внутри каждой группы, прикрепленные к каждой строке.на data_sam.

Я не уверен, что здесь возможно, поэтому, пожалуйста, дайте мне знать.

1 Ответ

0 голосов
/ 10 марта 2019

Рассмотрим by, объектно-ориентированную оболочку для tapply для запуска операций над подмножествами факторов. В частности, вы можете получить список фреймов данных, которые должны быть связаны в конце.

Ниже извлекается объект brks возвращаемого значения из вызова classIntervals как упоминание docs , предполагаемый как именованный вектор, где имена являются границами, а значения являются счетчиками.

df_list <- by(df, df[,c("group", "type")], function(sub) {
   tryCatch({
      res <- classIntervals(sub$vol, n=3, style="jenks")$brks

      data.frame(group = sub$group[1],
                 type = sub$type[1],
                 count1 = res[1],
                 count2 = res[2],
                 count3 = res[3],
                 boundary1 = names(res)[1],
                 boundary2 = names(res)[2],
                 boundary3 = names(res)[3])
      }, error = function(e) NA
   )
})

final_df <- do.call(rbind, df_list)
...