我有一个数据帧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
现在我循环遍历每一行并获取组数据子集的最小值/最大值,但是对于大型数据集来说这确实很慢。这样做的有效方法是什么?
答案 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
使用merge
和aggregate
的基础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))