如何根据两数据框数值差值设置表格单元格着色规则?
问题与解决方案
需求说明
基于两列数值对比为表格的col1列着色,规则如下:
- 当
col1 - col2 > 3时,col1设为绿色 - 当
col1 - col2 < -3时,col1设为红色 - 当
col1 - col2等于±3或0时,col1设为蓝色
数据集
mydata <- data.frame( School = c("A", "A", "A", "B", "B", "B", "B"), col1 = c(2, 10, 12, 0, 5, 5, 7), col2 = c(10, 7, 31, 3, 2, 1, 7) )
期望输出
School col1 col2 col1_color A 2 10 red A 10 7 blue A 12 31 red B 0 3 blue B 5 2 green B 5 1 green B 7 7 blue
现有代码
improvement_formatter <- formatter("span", style = x ~ style(color = ifelse(x > mydata$col1, "blue", ifelse(x < mydata$col2, "Red","green"))), x ~ icontext(ifelse(x<0, "arrow-up", "arrow-down"),x) ) formattable(mydata, list(`mydata$col1` = improvement_formatter))
修正后的代码实现
原代码存在逻辑错误(颜色判断规则不符、全局列引用错误),以下是修正后的完整实现:
library(formattable) # 构造数据集 mydata <- data.frame( School = c("A", "A", "A", "B", "B", "B", "B"), col1 = c(2, 10, 12, 0, 5, 5, 7), col2 = c(10, 7, 31, 3, 2, 1, 7) ) # 自定义格式化函数 col1_formatter <- formatter("span", style = x ~ { # 计算当前行col1与col2的差值 diff <- x - mydata$col2[seq_along(x)] # 根据差值匹配颜色规则 color <- ifelse(diff > 3, "green", ifelse(diff < -3, "red", "blue")) style(color = color) }, # 可选:保留箭头图标,根据差值方向显示 x ~ icontext(ifelse((x - mydata$col2[seq_along(x)]) > 0, "arrow-up", "arrow-down"), x) ) # 生成格式化表格 formattable(mydata, list(col1 = col1_formatter))
关键修正点
- 行级差值计算:通过
seq_along(x)匹配当前行的col2值,确保每行的差值计算准确,而非引用全局向量 - 颜色规则对齐需求:严格按照
col1-col2的差值范围设置颜色 - 列引用修正:原代码中
list(mydata$col1= ...)是错误写法,改为直接使用列名col1
验证颜色匹配
如果需要生成col1_color列验证结果,可执行以下代码:
# 计算颜色列 mydata$col1_color <- with(mydata, ifelse(col1 - col2 > 3, "green", ifelse(col1 - col2 < -3, "red", "blue"))) # 查看结果 print(mydata)
运行后将得到与期望输出完全一致的col1_color列。
内容的提问来源于stack exchange,提问作者akang
相关产品推荐
相关产品推荐

