微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Flextable - 根据行更改小数位数

如何解决Flextable - 根据行更改小数位数

所以我想在 Rstudio 中创建一个 flextable。这个flextable里面的数据包含了很多转换计算的数据,复现有点困难,希望原代码就够了。对此我深表歉意!

在创建 flextable 之前,我检查要转换的数据是否正确:

datt2 <- xtable(dat4,digits = 3)

显示给我的:

\begin{table}[ht]
\centering
\begin{tabular}{rrrrrrrrr}
  \hline
 & Ruimte1 & Ruimte2 & Ruimte3 & Ruimte4 & Ruimte5 & Ruimte6 & Ruimte7 & gem.beoordeling \\ 
  \hline
Laagopgeleid & 2.860 & 2.290 & 2.500 & 2.320 & 2.900 & 3.060 & 2.450 & 2.620 \\ 
  Hoogopgeleid & 2.880 & 2.280 & 2.560 & 2.460 & 3.240 & 3.150 & 2.670 & 2.750 \\ 
  T-test & 0.937 & 0.989 & 0.821 & 0.596 & 0.138 & 0.648 & 0.428 & 0.228 \\ 
   \hline
\end{tabular}
\end{table}

这对我来说似乎很好,并准备创建一个 flextable。唯一需要调整的是“Laagopgeleid”和“Hoogopgeleid”需要调整为2位小数。 “T 检验”需要保留 3 位小数。查看有关 colformat_double 的各种说明,我得出以下代码

date2 <- datt2 %>% xtable_to_flextable() %>% 
  fontsize(part = "header",size = 20) %>%
  fontsize(part = "body",size = 18) %>%
  align_text_col(align = "left") %>% 
  align_nottext_col(align = "center") %>% 
  width(width = 1.8) %>%
  width(j = 1,width = 3.3) %>%
  height_all(height = .5) %>%
  border_inner(border = std_border) %>% 
  font(fontname = "Open Sans") %>%
  colformat_double(j = c("Ruimte1","Ruimte2","Ruimte3","Ruimte4","Ruimte5","Ruimte6","Ruimte7","gem.beoordeling"),digits = 3) %>%
  colformat_double(i = Laagopgeleid,Hoogopgeleid,digits = 2) %>% 
  color(part = "header",color = d)

一个 colformat_double (digits = 3) 工作得很好,我什至可以把它改成别的东西,它可以做我想做的任何事情。但是第二个 colformat_double(i = Laagopgeleid,Hoogopgeleid) 做了一些非常奇怪的事情,它改变了“Hoogopgeleid”,如图here。我在 (i = ) 中提到哪一行或按哪个顺序只更改“Hoogopgeleid”并不重要。有关如何解决此问题的任何想法?

更新: 我只提供完整的代码,这样你就不会错过任何信息。我不想草率判断,但我确实发现在尝试创建带有行名的 flextable 时行名被设置为字符......因为我一直在尝试使用 colformat_double ......也许这也与它有关?>

per = ((df$opleiding.1.[df$startvraag=="Ja"]+df$opleiding.2.[df$startvraag=="Ja"])/ 
         (df$opleiding.1.[df$startvraag=="Ja"]+
            df$opleiding.2.[df$startvraag=="Ja"]+
            df$opleiding.3.[df$startvraag=="Ja"]+
            df$opleiding.4.[df$startvraag=="Ja"]))

per[is.na(per)] <- 0 #filters all NA or - and sets it to 0

words_to_num <- function(word){
  return(switch(word,"Geen mening"={NA},"Erg ontevreden"={1},"Niet erg tevreden"={2},"Redelijk tevreden"={3},"Zeer tevreden"={4}))
} #switches words to numbers

digits_to_words <- function(digit){
  return(switch(digit,"1"={"Erg ontevreden"},"2"={"Niet erg tevreden"},"3"={"Redelijk tevreden"},"4"={"Zeer tevreden"}))
} #changes the numbers back to words in order to get the average opinion

Ruimte1 <- as.integer(sapply(df$openbareruimte.1.[df$startvraag=="Ja"],words_to_num))
Ruimte2 <- as.integer(sapply(df$openbareruimte.2.[df$startvraag=="Ja"],words_to_num))
Ruimte3 <- as.integer(sapply(df$openbareruimte.3.[df$startvraag=="Ja"],words_to_num))
Ruimte4 <- as.integer(sapply(df$openbareruimte.4.[df$startvraag=="Ja"],words_to_num))
Ruimte5 <- as.integer(sapply(df$openbareruimte.5.[df$startvraag=="Ja"],words_to_num))
Ruimte6 <- as.integer(sapply(df$openbareruimte.6.[df$startvraag=="Ja"],words_to_num))
Ruimte7 <- as.integer(sapply(df$openbareruimte.7.[df$startvraag=="Ja"],words_to_num))
#Changes the dataset from words to numbers
#To give you an idea,this is what ruimte1 looks like after this
#> Ruimte1
# [1] 4 4 3 2 3 4 3 3 3 3 3 3 3 3 3 2 1 1 3 2 3 3 3 3 4 3 3 1 3 2 2 2 3 3 3 3 3 4 4 3 4
#[42] 3 3 2 3 3 3 3 4 4 2 1 3 3 3 3 3 3 3 1 3 4 3 3 3 3 3 3 3 4 1 3

R0 = data.frame(Ruimte1,Ruimte2,Ruimte3,Ruimte4,Ruimte5,Ruimte6,Ruimte7)
df$gemiddeld.Openbareruimte[df$startvraag=="Ja"] <- rowMeans(R0,dims = 1,na.rm = TRUE) %>% round(digits = 4)
#Creates the rowmean of ruimte1,2 etc... filters out NA while doing this.

dat1 <- data.frame(
  df$opleiding.1.[df$startvraag=="Ja"],df$opleiding.2.[df$startvraag=="Ja"],df$opleiding.3.[df$startvraag=="Ja"],df$opleiding.4.[df$startvraag=="Ja"],Percentage = per,Ruimte1,Ruimte7,df$gemiddeld.Openbareruimte[df$startvraag=="Ja"])
#Putting the above in a df to get the information I need

names(dat1)[names(dat1) == "df.opleiding.1..df.startvraag.....Ja.."] <- "Opl1"
names(dat1)[names(dat1) == "df.opleiding.2..df.startvraag.....Ja.."] <- "Opl2"
names(dat1)[names(dat1) == "df.opleiding.3..df.startvraag.....Ja.."] <- "Opl3"
names(dat1)[names(dat1) == "df.opleiding.4..df.startvraag.....Ja.."] <- "Opl4"
names(dat1)[names(dat1) == "Percentage"] <- "(Opl1+Opl2)/ (Opl1+Opl2+Opl3+Opl4)"
names(dat1)[names(dat1) == "df.gemiddeld.Openbareruimte.df.startvraag.....Ja.."] <- "Gemiddeld /n Openbare Ruimte"
#changes the column names of dat1

Laag <- dat1 %>% 
  filter(per <= 0.5)
Laag1<- sum(Laag$`Gemiddeld /n Openbare Ruimte`) / nrow(Laag)
#getting the average based on education level <= 50%

LR1 = data.frame(Laag$Ruimte1)
LR1 <- colMeans(LR1,na.rm = TRUE) %>% round(digits = 2)
LR2 = data.frame(Laag$Ruimte2)
LR2 <- colMeans(LR2,na.rm = TRUE) %>% round(digits = 2)
LR3 = data.frame(Laag$Ruimte3)
LR3 <- colMeans(LR3,na.rm = TRUE) %>% round(digits = 2)
LR4 = data.frame(Laag$Ruimte4)
LR4 <- colMeans(LR4,na.rm = TRUE) %>% round(digits = 2)
LR5 = data.frame(Laag$Ruimte5)
LR5 <- colMeans(LR5,na.rm = TRUE) %>% round(digits = 2)
LR6 = data.frame(Laag$Ruimte6)
LR6 <- colMeans(LR6,na.rm = TRUE) %>% round(digits = 2)
LR7 = data.frame(Laag$Ruimte7)
LR7 <- colMeans(LR7,na.rm = TRUE) %>% round(digits = 2)
# Getting the average on each ruimte# and filter out NA

Hoog <- dat1 %>% 
  filter(per > 0.5)
Hoog1 <- sum(Hoog$`Gemiddeld /n Openbare Ruimte`) / nrow(Hoog)

HR1 = data.frame(Hoog$Ruimte1)
HR1 <- colMeans(HR1,na.rm = TRUE) %>% round(digits = 2)
HR2 = data.frame(Hoog$Ruimte2)
HR2 <- colMeans(HR2,na.rm = TRUE) %>% round(digits = 2)
HR3 = data.frame(Hoog$Ruimte3)
HR3 <- colMeans(HR3,na.rm = TRUE) %>% round(digits = 2)
HR4 = data.frame(Hoog$Ruimte4)
HR4 <- colMeans(HR4,na.rm = TRUE) %>% round(digits = 2)
HR5 = data.frame(Hoog$Ruimte5)
HR5 <- colMeans(HR5,na.rm = TRUE) %>% round(digits = 2)
HR6 = data.frame(Hoog$Ruimte6)
HR6 <- colMeans(HR6,na.rm = TRUE) %>% round(digits = 2)
HR7 = data.frame(Hoog$Ruimte7)
HR7 <- colMeans(HR7,na.rm = TRUE) %>% round(digits = 2)

RT1 <- t.test(Hoog$Ruimte1,Laag$Ruimte1)
RT1 <- data.frame(RT1$p.value)
RT2 <- t.test(Hoog$Ruimte2,Laag$Ruimte2)
RT2 = data.frame(RT2$p.value)
RT3 <- t.test(Hoog$Ruimte3,Laag$Ruimte3)
RT3 = data.frame(RT3$p.value)
RT4 <- t.test(Hoog$Ruimte4,Laag$Ruimte4)
RT4 = data.frame(RT4$p.value)
RT5 <- t.test(Hoog$Ruimte5,Laag$Ruimte5)
RT5 = data.frame(RT5$p.value)
RT6 <- t.test(Hoog$Ruimte6,Laag$Ruimte6)
RT6 = data.frame(RT6$p.value)
RT7 <- t.test(Hoog$Ruimte7,Laag$Ruimte7)
RT7 = data.frame(RT7$p.value)
RT0 <- t.test(Hoog$`Gemiddeld /n Openbare Ruimte`,Laag$`Gemiddeld /n Openbare Ruimte`)
RT0 = data.frame(RT0$p.value)
#needed for getting the P.value of a t-test


dat2 <- data.frame(Laagopgeleid,Hoogopgeleid) %>% round(digits = 2)
gem.beoordeling <- c(apply(dat2,2,sort),RT0$RT0.p.value)

dat4 <- data.frame(Ruimte1 = c(LR1,HR1,RT1$RT1.p.value),Ruimte2 = c(LR2,HR2,RT2$RT2.p.value),Ruimte3 = c(LR3,HR3,RT3$RT3.p.value),Ruimte4 = c(LR4,HR4,RT4$RT4.p.value),Ruimte5 = c(LR5,HR5,RT5$RT5.p.value),Ruimte6 = c(LR6,HR6,RT6$RT6.p.value),Ruimte7 = c(LR7,HR7,RT7$RT7.p.value),gem.beoordeling)
colnames(dat4) <- c("Ruimte1","Gem.beoordeling")
rownames(dat4) <- c("Laagopgeleid","Hoogopgeleid","T-test")
dat4

datt2 <- xtable(dat4,digits = 3)

date2 <- flextable(dat4) %>%
  fontsize(part = "header",width = 3.3) %>%
  height_all(height = .5) %>%
  border_inner(border = std_border) %>% 
  font(fontname = "Open Sans") %>%
  colformat_double(i = c("Laagopgeleid","Hoogopgeleid"),color = d)
date2


dat3 <- data.frame(Laagopgeleid,Hoogopgeleid) %>% round(digits = 0)
Range <- apply(dat3,sort)
Range <- as.character(sapply(Range,digits_to_words))

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。