用另一个变量的最大值或最小值创建一个新变量 - 按组

时间:2016-05-27 07:38:22

标签: r

R社区:我试图根据现有变量的值创建一个新变量,而不是基于行,而是基于组。我尝试根据max.var创建下面的min.varold.var,而不会折叠或聚合行,即保留所有id行:

id  old.var min.var max.var
1   1   1   3
1   2   1   3
1   3   1   3
2   5   5   11
2   7   5   11
2   9   5   11
2   11  5   11
3   3   3   4
3   4   3   4

structure(list(id = c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L), old.var = 
c(1L, 
2L, 3L, 5L, 7L, 9L, 11L, 3L, 4L), min.var = c(1L, 1L, 1L, 5L, 
5L, 5L, 5L, 3L, 3L), max.var = c(3L, 3L, 3L, 11L, 11L, 11L, 11L, 
4L, 4L)), .Names = c("id", "old.var", "min.var", "max.var"), class = "data.frame", row.names = c(NA, 
-9L))

我已尝试使用aggregateby功能,但他们当然会总结数据。我也没有尝试类似Excel的MATCH / INDEX方法。在此先感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

您可以使用dplyr

df %>% 
   group_by(id) %>%
   mutate(min.var = min(old.var), max.var = max(old.var))

#Source: local data frame [9 x 4]
#Groups: id [3]

#     id old.var min.var max.var
#  (int)   (int)   (int)   (int)
#1     1       1       1       3
#2     1       2       1       3
#3     1       3       1       3
#4     2       5       5      11
#5     2       7       5      11
#6     2       9       5      11
#7     2      11       5      11
#8     3       3       3       4
#9     3       4       3       4

答案 1 :(得分:2)

我们可以使用data.table

library(data.table)
setDT(df1)[, c('min.var', 'max.var') := list(min(old.var), max(old.var)) , by = id]
df1
#   id old.var min.var max.var
#1:  1       1       1       3
#2:  1       2       1       3
#3:  1       3       1       3
#4:  2       5       5      11
#5:  2       7       5      11
#6:  2       9       5      11
#7:  2      11       5      11
#8:  3       3       3       4
#9:  3       4       3       4

答案 2 :(得分:1)

使用ave作为docendo discimus在问题的评论中指出:

df$min.var <- ave(df$old.var, df$id, FUN = min)
df$max.var <- ave(df$old.var, df$id, FUN = max)

输出:

  id old.var min.var max.var
1  1       1       1       3
2  1       2       1       3
3  1       3       1       3
4  2       5       5      11
5  2       7       5      11
6  2       9       5      11
7  2      11       5      11
8  3       3       3       4
9  3       4       3       4