使用Dplyr获取每行数据的最小值与最大值的实现流程
使用dplyr为每行数据添加最小值与最大值
看起来你已经构造了一个包含id、类型和收集日期的数据集,想要用dplyr来获取每行对应的最小值和最大值。这里分两种常见场景来帮你实现:
场景1:按分组计算每组的最小/最大值(最常见需求)
如果你的需求是按某个或某些维度分组(比如id + type),然后为每行添加该组的最小/最大收集日期,可以用dplyr的分组+窗口函数来实现:
代码示例
library(dplyr) # 你的数据集构造代码 id <- c("1", "2", "3", "1", "2", "3", "1", "2", "3", "1", "2", "3", "1", "2", "3") type <- c("A", "A", "B", "A", "B", "B", "B", "B", "A", "B", "B", "A", "A", "B", "A") date_collected <- as.Date(c("2018-01-01", "2018-01-01", "2018-01-01", "2018-01-02", "2018-01-02", "2018-01-02", "2018-01-03", "2018-01-03", "2018-01-03", "2018-01-04", "2018-01-04", "2018-01-04", "2018-01-05", "2018-01-05", "2018-01-05")) df <- data.frame(id, type, date_collected) # 按id和type分组,计算每组的最小、最大日期,并添加到每行 df_with_minmax <- df %>% group_by(id, type) %>% mutate( min_date = min(date_collected), max_date = max(date_collected) ) %>% ungroup() # 查看结果 print(df_with_minmax)
说明
group_by(id, type):指定分组维度,这里按id和类型组合分组mutate():在原数据基础上新增列,min(date_collected)和max(date_collected)会自动计算每组的最小/最大日期ungroup():取消分组,避免后续操作受分组影响
场景2:计算每行自身各列的最小/最大值(针对可比较类型)
如果你的需求是对每行的所有可比较列(比如日期)计算最小和最大值(注:字符列的min/max是按字母顺序排序,意义不大),可以用rowwise()结合c_across()来实现:
代码示例
df_row_minmax <- df %>% rowwise() %>% mutate( # 只针对日期列计算行内min/max row_min_date = min(c_across(date_collected)), row_max_date = max(c_across(date_collected)), # 如果要包含字符列的min/max(按字母顺序) row_min_char = min(c_across(c(id, type))), row_max_char = max(c_across(c(id, type))) ) %>% ungroup() print(df_row_minmax)
说明
rowwise():将数据按行分组,让后续的聚合函数(min/max)作用于每行c_across():选中要计算的列,这里可以指定单个列或列范围- 注意:因为每行只有一个日期值,所以
row_min_date和row_max_date会等于该行的date_collected;字符列的min/max是按ASCII顺序比较的(比如"1"<"2"<"3","A"<"B")
如果你的需求和以上两种场景不同,可以补充说明具体的计算维度,我再帮你调整!
内容的提问来源于stack exchange,提问作者roboes
相关产品推荐
相关产品推荐

