这是我有关此问题的第二篇文章。第一个已关闭,但没有解决我的表格格式问题。
我是Stack Overflow的新手,对Rmarkdown还是很新。我正在尝试使用Rmarkdown编写出版物(输出= book down :: pdf_book),并且表格式存在问题。我想在r块中构建一个平面表以获得这种表,但是要用平均值而不是count:
古德格式,但计数:
F2 N0 N1 N2
F1 I II I II I II
Variable F3
V1 T 3 3 3 3 3 3
V 3 3 3 3 3 3
V2 T 3 3 3 3 3 3
V 3 3 3 3 3 3
V3 T 3 3 3 3 3 3
V 3 3 3 3 3 3
V4 T 3 3 3 3 3 3
V 3 3 3 3 3 3
V5 T 3 3 3 3 3 3
V 3 3 3 3 3 3
假设我有一个看起来像这样的数据框:
F1 F2 F3 V1 V2 V3 V4 V5
I N0 T 1.977546019 137.5 0.83 8.114217417 1.032679447
I N0 T 2.342365156 139.4 0.85 10.3602728 0.871637237
I N0 T 2.170706854 141.2 0.82 11.59271819 1.258035755
I N0 V 1.559072025 114.9 0.87 11.57618562 1.661523112
I N0 V 1.984240008 118.6 0.88 11.9835584 1.60688624
I N0 V 1.68756027 116.3 0.88 11.79686026 1.78102523
I N1 T 2.19858517 139.7 0.85 33.1128997 4.312955185
I N1 T 3.249054469 136.4 0.86 29.69128121 3.047780521
I N1 T 2.223041022 142.1 0.85 20.65967924 2.332772924
I N1 V 1.595849998 118.2 0.89 19.84579734 2.191828463
I N1 V 1.72860847 114.8 0.86 20.16367213 5.017873836
I N1 V 2.133891213 115.7 0.84 23.07712358 3.930948522
I N2 T 3.152019262 131.3 0.89 35.5848969 5.589698563
I N2 T 3.367223676 138.7 0.87 34.05297654 2.730557232
I N2 T 3.059409463 137.4 0.83 35.37992694 3.548049932
I N2 V 1.71633507 112.3 0.93 34.09476427 5.25868398
I N2 V 2.284833663 116.9 0.84 22.19728478 3.518505779
I N2 V 1.866355607 113.6 0.86 29.02993798 5.014262016
II N0 T 1.768065012 127.8 0.83 7.6010075 9.42999993
II N0 T 3.250876694 129.4 0.83 29.23677503 27.91017246
II N0 T 2.815832568 133.6 0.83 4.051675097 10.12918774
II N0 V 3.891509434 109.1 0.88 5.469474969 9.770670085
II N0 V 2.882145915 111.2 0.87 17.00061485 21.40077399
II N0 V 4.128069071 113.7 0.88 12.9571096 37.50296115
II N1 T 3.003514751 126 0.84 39.39306152 7.043527056
II N1 T 3.134655188 129.2 0.85 11.4866755 21.51749579
II N1 T 2.785986782 131.5 0.83 19.78519656 2.176659469
II N1 V 3.089649674 107.5 0.88 17.32529262 12.99396947
II N1 V 4.466019417 112.6 0.89 12.03083642 20.22446923
II N1 V 3.1820755 116.1 0.84 12.63619614 12.65798269
II N2 T 3.428280773 134.2 0.87 16.67590015 14.49664664
II N2 T 4.430091185 139.8 0.85 36.47033184 12.18635248
II N2 T 3.362380446 132.4 0.86 67.7182946 11.7089442
II N2 V 3.672823219 111.6 0.9 24.5684152 13.5849653
II N2 V 3.031651201 110.1 0.88 19.7549665 15.6015459
II N2 V 3.198950088 108.7 0.88 20.86135738 14.60295017
其中F列是因子,V列是变量
让此数据帧命名为“ df”。
我尝试了两种方法来实现平板化:
我使用pivot_longer
包中的函数tidy verse
将变量名作为列:
df %>% pivot_longer(
-c(F1,F2,F3),
names_to = "Variable",
values_to = "Value") -> df2
并使用此代码构建了平面表:
ftable(df2, row.vars = c("Variable", "F3"), col.vars = c("F2", "F1"))
我在这里获得目标表的格式,但是值是计数,而不是平均值(请参阅“ GoodTable””)。
我使用'''dplyr'''软件包计算均值(和标准误)
df2_summary <- dplyr::summarise(df2_grouped,
count = dplyr::n(),
mean = round(mean(Value), 2),
SE = round(sd(Value)/sqrt(count),2))
但是我不知道如何将df2_summary转换为上面的表格
我知道我可以使用乳胶语言来格式化和完成表格,但是这很耗时,并且还会产生键入错误。 有人知道怎么做吗?
谢谢!
答案 0 :(得分:0)
这看起来是否接近您想要的?请使用“ dput”发送数据帧 而不是必须删除多余空格的文本输出。
library(tidyverse)
df <- read_delim(file = "
F1 F2 F3 V1 V2 V3 V4 V5
I N0 T 1.977546019 137.5 0.83 8.114217417 1.032679447
I N0 T 2.342365156 139.4 0.85 10.3602728 0.871637237
I N0 T 2.170706854 141.2 0.82 11.59271819 1.258035755
I N0 V 1.559072025 114.9 0.87 11.57618562 1.661523112
I N0 V 1.984240008 118.6 0.88 11.9835584 1.60688624
I N0 V 1.68756027 116.3 0.88 11.79686026 1.78102523
I N1 T 2.19858517 139.7 0.85 33.1128997 4.312955185
I N1 T 3.249054469 136.4 0.86 29.69128121 3.047780521
I N1 T 2.223041022 142.1 0.85 20.65967924 2.332772924
I N1 V 1.595849998 118.2 0.89 19.84579734 2.191828463
I N1 V 1.72860847 114.8 0.86 20.16367213 5.017873836
I N1 V 2.133891213 115.7 0.84 23.07712358 3.930948522
I N2 T 3.152019262 131.3 0.89 35.5848969 5.589698563
I N2 T 3.367223676 138.7 0.87 34.05297654 2.730557232
I N2 T 3.059409463 137.4 0.83 35.37992694 3.548049932
I N2 V 1.71633507 112.3 0.93 34.09476427 5.25868398
I N2 V 2.284833663 116.9 0.84 22.19728478 3.518505779
I N2 V 1.866355607 113.6 0.86 29.02993798 5.014262016
II N0 T 1.768065012 127.8 0.83 7.6010075 9.42999993
II N0 T 3.250876694 129.4 0.83 29.23677503 27.91017246
II N0 T 2.815832568 133.6 0.83 4.051675097 10.12918774
II N0 V 3.891509434 109.1 0.88 5.469474969 9.770670085
II N0 V 2.882145915 111.2 0.87 17.00061485 21.40077399
II N0 V 4.128069071 113.7 0.88 12.9571096 37.50296115
II N1 T 3.003514751 126 0.84 39.39306152 7.043527056
II N1 T 3.134655188 129.2 0.85 11.4866755 21.51749579
II N1 T 2.785986782 131.5 0.83 19.78519656 2.176659469
II N1 V 3.089649674 107.5 0.88 17.32529262 12.99396947
II N1 V 4.466019417 112.6 0.89 12.03083642 20.22446923
II N1 V 3.1820755 116.1 0.84 12.63619614 12.65798269
II N2 T 3.428280773 134.2 0.87 16.67590015 14.49664664
II N2 T 4.430091185 139.8 0.85 36.47033184 12.18635248
II N2 T 3.362380446 132.4 0.86 67.7182946 11.7089442
II N2 V 3.672823219 111.6 0.9 24.5684152 13.5849653
II N2 V 3.031651201 110.1 0.88 19.7549665 15.6015459
II N2 V 3.198950088 108.7 0.88 20.86135738 14.60295017",
delim = ' ') %>%
mutate(across(starts_with("V"), as.numeric))
df2 <- df %>%
pivot_longer(cols = starts_with("V"),
names_to = "Variable",
values_to = 'Value') %>%
group_by(Variable, F3, F1, F2) %>%
summarise(avg = mean(Value),
count = n()) %>%
ungroup() %>%
pivot_wider(id_cols = c(Variable, F3),
names_from = c(F1, F2),
names_glue = "{F1}_{F2}",
values_from = avg)
print(df2)
# A tibble: 10 x 8
Variable F3 I_N0 I_N1 I_N2 II_N0 II_N1 II_N2
<chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 V1 T 2.16 2.56 3.19 2.61 2.97 3.74
2 V1 V 1.74 1.82 1.96 3.63 3.58 3.30
3 V2 T 139. 139. 136. 130. 129. 135.
4 V2 V 117. 116. 114. 111. 112. 110.
5 V3 T 0.833 0.853 0.863 0.83 0.84 0.86
6 V3 V 0.877 0.863 0.877 0.877 0.87 0.887
7 V4 T 10.0 27.8 35.0 13.6 23.6 40.3
8 V4 V 11.8 21.0 28.4 11.8 14.0 21.7
9 V5 T 1.05 3.23 3.96 15.8 10.2 12.8
10 V5 V 1.68 3.71 4.60 22.9 15.3 14.6
答案 1 :(得分:0)
我已经解决了这个问题。 这是一个代码,给出的表格式与我想要的不完全相同,但相似: 我使用了函数“ collapse_rows”,因此与我想要的表相比,我不得不转置该表。我不知道列的这种功能。
df2 <- df %>%
group_by(Month, Enrichment, Vegetation) %>%
summarise(
across(
.cols = starts_with(c("V")),
.fns = list(mean, sd),
.names = "{col}_{fn}"
)
)
以下是计算标准误差而不是标准偏差的难看代码:
df2[,c(5,7,9,11,13,15,17)] <- df2[,c(5,7,9,11,13,15,17)]/sqrt(3)
然后更改列的名称,但请记住顺序(如果忘记了,可以查看函数“ start_with”)。第一列的第二个因素是我删除它们的因素,因为它们通常很长,我需要减小表的大小。这可能不是最有效的方法,但至少可以奏效
colnames(df2)[2:17] <- c("", "", "Mean", "SE","Mean", "SE","Mean", "SE","Mean", "SE","Mean", "SE")
我在下面使用了kableExtra包
library(kableExtra)
kable(df2, "latex", digits = 1,
booktabs = TRUE, align = "c",
caption = '(ref:df)',
linesep = "") %>%
add_header_above(c(" " = 3, "V1" = 2, "V2" = 2, "V3" = 2, "V4" = 2, "V5" = 2),
bold = T) %>%
collapse_rows(1:2,
row_group_label_position = 'stack',
latex_hline = "none")%>%
landscape()
以防万一,对于kableExtra包裹,它们是非常好的装饰物