如何快速将列汇总为数据框中的新列[R]

时间:2017-08-16 21:47:20

标签: r

我有一个数据帧df_workingFile:

group  | value
 a     |   1
 a     |   3
 b     |   2
 b     |   2

我想添加两个新列 - 一个用于每个组的最小值和最大值

group  | value | max | min
 a     |   1   |  3  |  1
 a     |   3   |  3  |  1
 b     |   2   |  2  |  2
 b     |   2   |  2  |  2

现在我循环遍历每一行并获取组数据子集的最小值/最大值,但是对于大型数据集来说这确实很慢。这样做的有效方法是什么?

2 个答案:

答案 0 :(得分:4)

使用dplyr包,您可以执行以下操作:

df_workingFile %>% 
  group_by(group) %>% 
  mutate(max = max(value), min = min(value)) %>% ungroup()

  # A tibble: 4 x 4
   group value   min   max
   <chr> <dbl> <dbl> <dbl>
1      a     1     1     3
2      a     3     1     3
3      b     2     2     2
4      b     2     2     2

答案 1 :(得分:0)

使用plyr包:

library(plyr)
ddply(df, "group", transform, max = max(value), min = min(value))

#   group value max min 
# 1     a     1   3   1 
# 2     a     3   3   1 
# 3     b     2   2   2 
# 4     b     2   2   2

使用data.table包:

library(data.table)
setDT(df)[, max := max(value), by = group][, min := min(value), by = group]

#    group value max min 
# 1:     a     1   3   1 
# 2:     a     3   3   1 
# 3:     b     2   2   2 
# 4:     b     2   2   2

使用mergeaggregate的基础R解决方案:

  merge(df, setNames(aggregate(value ~ group, data = df, range),c("group","range")), 
                by = "group", suffixes = c("",""))

#   group value range.1 range.2 
# 1     a     1       1       3 
# 2     a     3       1       3 
# 3     b     2       2       2 
# 4     b     2       2       2

注意: 后一种解决方案的结构有点棘手。使用时请小心。

<强> 数据:

df <- structure(list(group = structure(c(1L, 1L, 2L, 2L), .Label = c("a", 
      "b"), class = "factor"), value = c(1L, 3L, 2L, 2L)), .Names = c("group", 
      "value"), class = "data.frame", row.names = c(NA, -4L))