R:在层次结构中分组

时间:2018-03-16 13:30:15

标签: r grouping hierarchy

我正在处理一个带有六位数分组系统的数据集。前两个数字表示顶层的分组,后两个数字表示不同的子组,后两个数字表示子组内的特定类型。我想将数据分组到层次结构中的顶层(仅限两个第一位),并计算每个组中的唯一名称。

GroupID 010203的一个示例:

  • 01表示宝马
  • 02表示3系列
  • 03表示320i(确切型号)

在这个例子中我关心的是每个品牌有多少。

玩具数据集和想要的输出:

df <- data.table(Quarter = c('Q4', 'Q4', 'Q4', 'Q4', 'Q3'),
                 GroupID = c(010203, 150503, 010101, 150609, 010000),
                 Name = c('AAAA', 'AAAA', 'BBBB', 'BBBB', 'CCCC'))

输出:

Quarter     Group     Counts
Q3          01        1
Q4          01        2
Q4          15        2

4 个答案:

答案 0 :(得分:2)

我们可以使用data.table

library(data.table)

dt[, Group := substr(GroupID, 1, 2)][
   , Counts := .N, by = list(Group, Quarter)][
   , head(.SD, 1), by = .(Quarter, Group, Counts)][
   , .(Quarter, Group, Counts)]

返回:

   Quarter Group Counts
1:      Q4    01      2
2:      Q4    15      2
3:      Q3    01      1

使用dplyrstringr我们可以执行以下操作:

library(dplyr)
library(stringr)

df %>% 
  mutate(Group = str_sub(GroupID, 1, 2)) %>% 
  group_by(Group, Quarter) %>% 
  summarise(Counts = n()) %>% 
  ungroup()

返回:

# A tibble: 3 x 3
  Group Quarter Counts
  <chr> <fct>    <int>
1 01    Q3           1
2 01    Q4           2
3 15    Q4           2

答案 1 :(得分:1)

由于您已经在使用let string = withUnsafePointer(to: &tupleOfBytes) { ptr -> String in return String(cString: UnsafeRawPointer(ptr).assumingMemoryBound(to: CChar.self)) } return string ,因此可以执行以下操作:

linedelimiter

答案 2 :(得分:0)

这是我使用df["date"] = df["date"].dt.strftime("%Y-%m")plyr的简单解决方案,它快速闪电。

base R

<强>结果

library(plyr)
df$breakid <- as.character((substr(df$GroupID, start =0 , stop = 2)))
d <- plyr::count(df, c("Quarter", "breakid"))

答案 3 :(得分:0)

或者,使用tapply(以及data.table索引):

df$Brand <- substr(df$GroupID, 1, 2)
tapply(df$Brand, df[, .(Quarter, Brand)], length)

(如果您不关心输出是矩阵)。