使用lapply基于条件格式化表

时间:2014-03-26 16:46:59

标签: r dataframe lapply xtable

我想在使用xtable创建的Latex表中为单元格着色。 我有一个看起来像这样的数据框:

a <- data.frame(a=c(seq(1:100)),b=c(seq(1:100)),b=c(seq(1:100)))

现在我希望每个单元格根据其值单独着色。我创建了以下函数来实现这一目标:

formatting<-function(x){ifelse(x<50,paste("\\cellcolor{red}{",x,"}"),x)
                         ifelse(x>=50&x<=80,paste("\\cellcolor{yellow}{",x,"}"),x)
                         ifelse(x>=80,paste("\\cellcolor{green}{",x,"}"),x)
}

但是,在我的函数中对此数据框应用lapply仅执行函数的最后一行(绿色着色)

a <- data.frame(lapply(a, FUN=formatting))

基本上我希望值<50以红色显示\\cellcolor{red}{",x,"}"),黄色显示50-80之间的值\\cellcolor{yellow}{",x,"}"),绿色显示值80以上(\\cellcolor{green}{",x,"}")

我的功能有什么问题?我还注意到,如果我单独为每种颜色创建一个函数,我会发出警告说:

red<-function(x){ifelse(x<50,paste("\\cellcolor{red}{",x,"}"),x)}            
yellow<-function(x){ifelse(x>=50&x<=80,paste("\\cellcolor{yellow}{",x,"}"),x)}
green<-function(x){ifelse(x>=80,paste("\\cellcolor{green}{",x,"}"),x)}

a <- data.frame(lapply(a, FUN=red))
a <- data.frame(lapply(a, FUN=yellow))
a <- data.frame(lapply(a, FUN=green))

Warning message:
1: In Ops.factor(x, 50) : >= not meaningful for factors

任何人都可以帮我吗?

我用以下代码玩了一下:

resistant<-function(x){ifelse((x>=0&x<50),paste("\\cellcolor{red}{",x,"}"),x)}
intermediate<-function(x){ifelse((x>=50&x<80),paste("\\cellcolor{yellow}{",x,"}"),x)}
susceptible<-function(x){ifelse((x>=80&x<=100),paste("\\cellcolor{green}{",x,"}"),x)}
a<-as.data.frame(apply(a,2, FUN=resistant))
a<-as.data.frame(apply(a,2, FUN=intermediate))
a<-as.data.frame(apply(a,2, FUN=susceptible))

但是,似乎只有最后一行没有正确执行。为什么呢?

1 个答案:

答案 0 :(得分:2)

我终于能够自己解决问题了。对我有用的解决方案是使用嵌套的ifelse函数:

func<-function(x){ifelse(x<50,paste("\\cellcolor{red}{",x,"}"),
                          ifelse(x>=50&x<80,paste("\\cellcolor{yellow}{",x,"}"),paste("\\cellcolor{green}{",x,"}")))}

并申请:

a<-as.data.frame(apply(a,2, FUN=func))

完成了这项工作:)