能否使用dplyr的mutate函数按两列分组进行值的除法运算?
解决方案
首先注意你的数据中Year和value都是字符类型,第一步需要先转换为数值类型才能进行计算。下面提供两种可行的方法:
方法一:分组后直接提取对应年份的值计算
library(dplyr) # 转换数据类型并计算比值 result <- df %>% mutate(Year = as.integer(Year), value = as.numeric(value)) %>% group_by(Trt) %>% summarize(ratio = value[Year == 1] / value[Year == 0]) print(result)
运行后会得到每个Trt对应的Year1数值除以Year0数值的结果:
# A tibble: 3 × 2 Trt ratio <chr> <dbl> 1 A 0.333 2 B 1.67 3 C 0.75
方法二:先将年份转为列再计算
这种方法更直观,先把长格式转成宽格式后直接做除法:
library(dplyr) library(tidyr) result <- df %>% mutate(Year = paste0("Year", Year), value = as.numeric(value)) %>% pivot_wider(names_from = Year, values_from = value) %>% mutate(ratio = Year1 / Year0) print(result)
输出结果:
# A tibble: 3 × 4 Trt Year1 Year0 ratio <chr> <dbl> <dbl> <dbl> 1 A 2 6 0.333 2 B 5 3 1.67 3 C 3 4 0.75
为什么你之前用group_by+mutate没成功?
大概率是因为数据类型没转换(字符无法直接做除法),或者mutate会保留原数据的行数,而你需要的是每个分组一行的汇总结果,这时候用summarize比mutate更合适。
内容的提问来源于stack exchange,提问作者davidr21
相关产品推荐
相关产品推荐

