包含具有两个值的单元格的Rmarkdown表
我想使用rmarkdown创建一个表格,其中每个单元格有两个值,例如包含具有两个值的单元格的Rmarkdown表,r,markdown,r-markdown,R,Markdown,R Markdown,我想使用rmarkdown创建一个表格,其中每个单元格有两个值,例如3.1(0.05)或78±23.3。这类表格在科学文献()中非常常见,我们希望简洁地显示平均值和标准偏差,或者一个值加上减去一些误差项。因此,在使用Rmarkdown时,有一种简单的方法来生成它们是很有用的。例如: # my table mtcars mpg cyl disp hp drat wt qsec vs am gear carb Mazda RX4
3.1(0.05)
或78±23.3
。这类表格在科学文献()中非常常见,我们希望简洁地显示平均值和标准偏差,或者一个值加上减去一些误差项。因此,在使用Rmarkdown时,有一种简单的方法来生成它们是很有用的。例如:
# my table
mtcars
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
[snipped]
# my other table, that I want to combine with the first
some_error_term_for_mtcars <- data.frame(sapply(1:ncol(mtcars), function(i) sample(x = (min(mtcars[, i])/10):max(mtcars[, i])/10, nrow(mtcars), replace = TRUE)))
some_error_term_for_mtcars
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11
1 2.704 0.44 26.011 3.92 0.4276 0.21513 1.145 0.0 0.0 0.03 0.41
2 0.604 0.44 5.211 6.32 0.0276 0.01513 1.345 0.1 0.1 0.33 0.21
3 3.304 0.14 31.511 20.42 0.1276 0.51513 0.145 0.1 0.0 0.43 0.71
4 1.004 0.44 16.011 26.02 0.2276 0.11513 1.345 0.1 0.0 0.03 0.31
5 2.604 0.34 4.311 30.02 0.0276 0.31513 1.745 0.1 0.1 0.23 0.41
6 2.404 0.64 8.011 27.92 0.1276 0.21513 1.145 0.0 0.1 0.33 0.41
7 2.804 0.14 4.811 14.92 0.1276 0.01513 0.345 0.1 0.0 0.13 0.31
[snipped]
#我的表格
地铁车辆
mpg气缸显示hp drat wt qsec与am齿轮carb
马自达RX421.06160.01103.902.62016.46014
马自达RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 4 1
大黄蜂4路21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
大黄蜂运动约18.7 8 360.0 175 3.15 3.440 17.02 0 3 2
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
除尘器360 14.3 8 360.0 245 3.21 3.570 15.84 0 3 4
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
[剪下]
#我的另一张桌子,我想和第一张桌子合并
我们可以这样做,然后使用knitr::kable
获得降价:
two_tables_into_one <- as.data.frame(do.call(cbind, lapply(1:ncol(mtcars), function(i) paste0(mtcars[ , i], " (", some_error_term_for_mtcars[ , i], ")" ) )))
names(two_tables_into_one) <- names(mtcars)
head(two_tables_into_one)
mpg cyl disp hp drat wt qsec vs
1 21 (2.704) 6 (0.44) 160 (26.011) 110 (3.92) 3.9 (0.4276) 2.62 (0.21513) 16.46 (1.145) 0 (0)
2 21 (0.604) 6 (0.44) 160 (5.211) 110 (6.32) 3.9 (0.0276) 2.875 (0.01513) 17.02 (1.345) 0 (0.1)
3 22.8 (3.304) 4 (0.14) 108 (31.511) 93 (20.42) 3.85 (0.1276) 2.32 (0.51513) 18.61 (0.145) 1 (0.1)
4 21.4 (1.004) 6 (0.44) 258 (16.011) 110 (26.02) 3.08 (0.2276) 3.215 (0.11513) 19.44 (1.345) 1 (0.1)
5 18.7 (2.604) 8 (0.34) 360 (4.311) 175 (30.02) 3.15 (0.0276) 3.44 (0.31513) 17.02 (1.745) 0 (0.1)
6 18.1 (2.404) 6 (0.64) 225 (8.011) 105 (27.92) 2.76 (0.1276) 3.46 (0.21513) 20.22 (1.145) 1 (0)
am gear carb
1 1 (0) 4 (0.03) 4 (0.41)
2 1 (0.1) 4 (0.33) 4 (0.21)
3 1 (0) 4 (0.43) 1 (0.71)
4 0 (0) 3 (0.03) 1 (0.31)
5 0 (0.1) 3 (0.23) 2 (0.41)
6 0 (0.1) 3 (0.33) 1 (0.41)
knitr::kable(head(two_tables_into_one))
two\u tables\u into\u one我在我的软件包中使用了以下技术(您可以查看descr()
和print.summarytools()
的源代码以获取所有详细信息)
然后,为了使用生成rmarkdown表,我们可以简单地执行以下操作:
> library(pander)
> pander(x = obs, style="rmarkdown")
| | Sepal.Length | Sepal.Width | Petal.Length |
|:-----------:|:--------------:|:-------------:|:--------------:|
| **Valid** | 150 (100%) | 150 (100%) | 150 (100%) |
| **<NA>** | 0 (0%) | 0 (0%) | 0 (0%) |
| **Total** | 150 (100%) | 150 (100%) | 150 (100%) |
Table: Table continues below
| | Petal.Width |
|:-----------:|:-------------:|
| **Valid** | 150 (100%) |
| **<NA>** | 0 (0%) |
| **Total** | 150 (100%) |
现在,对于组合来自两个不同数据集的数据,一个好的for
循环可以很好地完成这项工作:
names(some_error_term_for_mtcars) <- names(mtcars)
new.df <- mtcars
for (n in names(mtcars)) {
new.df[,n] <- paste(mtcars[,n], "±",round(some_error_term_for_mtcars[,n],2))
}
pander(new.df, style="rmarkdown")
tidyr::unite
,但您仍然必须在右括号上粘贴0
。不过更好?你在回答一个新问题吗?@Pascal我在邀请更好的答案@阿利斯泰尔,你介意详细说明一下吗?对于我来说,unite
如何在两个表上工作并不明显。这不是必要的Rmarkdown问题。结果可以用在降价中,但这可以说是几乎所有的问题。。。但不完全相同@是的,评论不错。我想知道是否有一种简单的方法可以在降价生成点使用pander。哦,我确实理解你的目标,以及与降价的关系(最近我一直在与knitr/markdown
斗争,并切换到reporteRs
)。我只是认为,就目前的情况而言,与降价的关系相当薄弱。您能否详细说明如何使用循环方法组合两个表?好的,我看到您在使用lappy的地方使用了循环。非常合理的选择,谢谢。
output$observ[i,] <- c(paste0(n.valid, " (", p.valid, "%)"),
paste0(n.NA, " (", p.NA, "%)"),
paste(n.valid + n.NA, "(100%)"))
> library(pander)
> pander(x = obs, style="rmarkdown")
| | Sepal.Length | Sepal.Width | Petal.Length |
|:-----------:|:--------------:|:-------------:|:--------------:|
| **Valid** | 150 (100%) | 150 (100%) | 150 (100%) |
| **<NA>** | 0 (0%) | 0 (0%) | 0 (0%) |
| **Total** | 150 (100%) | 150 (100%) | 150 (100%) |
Table: Table continues below
| | Petal.Width |
|:-----------:|:-------------:|
| **Valid** | 150 (100%) |
| **<NA>** | 0 (0%) |
| **Total** | 150 (100%) |
> descr(iris, style = "rmarkdown", plain.ascii = FALSE)
Non-numerical variable(s) ignored: Species
Descriptive Statistics
Dataframe: iris
| | Sepal.Length | Sepal.Width | Petal.Length | Petal.Width |
|------------------:|---------------:|--------------:|---------------:|--------------:|
| **Mean** | 5.84 | 3.06 | 3.76 | 1.2 |
| **Std.Dev** | 0.83 | 0.44 | 1.77 | 0.76 |
| **Min** | 4.3 | 2 | 1 | 0.1 |
| **Max** | 7.9 | 4.4 | 6.9 | 2.5 |
| **Median** | 5.8 | 3 | 4.35 | 1.3 |
| **mad** | 1.04 | 0.44 | 1.85 | 1.04 |
| **IQR** | 1.3 | 0.5 | 3.5 | 1.5 |
| **CV** | 7.06 | 7.01 | 2.13 | 1.57 |
| **Skewness** | 0.31 | 0.31 | -0.27 | -0.1 |
| **SE.Skewness** | 0.2 | 0.2 | 0.2 | 0.2 |
| **Kurtosis** | -0.61 | 0.14 | -1.42 | -1.36 |
Observations
| | Sepal.Length | Sepal.Width | Petal.Length | Petal.Width |
|------------:|---------------:|--------------:|---------------:|--------------:|
| **Valid** | 150 (100%) | 150 (100%) | 150 (100%) | 150 (100%) |
| **<NA>** | 0 (0%) | 0 (0%) | 0 (0%) | 0 (0%) |
| **Total** | 150 (100%) | 150 (100%) | 150 (100%) | 150 (100%) |
names(some_error_term_for_mtcars) <- names(mtcars)
new.df <- mtcars
for (n in names(mtcars)) {
new.df[,n] <- paste(mtcars[,n], "±",round(some_error_term_for_mtcars[,n],2))
}
pander(new.df, style="rmarkdown")
| | mpg | cyl | disp |
|:-------------------------:|:----------:|:--------:|:-------------:|
| **Mazda RX4** | 21 ± 2 | 6 ± 0.04 | 160 ± 33.61 |
| **Mazda RX4 Wag** | 21 ± 0.8 | 6 ± 0.14 | 160 ± 26.11 |
| **Datsun 710** | 22.8 ± 0.1 | 4 ± 0.64 | 108 ± 45.81 |
| **Hornet 4 Drive** | 21.4 ± 1.7 | 6 ± 0.04 | 258 ± 33.81 |
| **Hornet Sportabout** | 18.7 ± 2.7 | 8 ± 0.54 | 360 ± 37.81 |
| **Valiant** | 18.1 ± 3.3 | 6 ± 0.14 | 225 ± 36.31 |
| **Duster 360** | 14.3 ± 0.1 | 8 ± 0.24 | 360 ± 2.01 |
| **Merc 240D** | 24.4 ± 2.3 | 4 ± 0.14 | 146.7 ± 8.81 |
| **Merc 230** | 22.8 ± 1.7 | 4 ± 0.04 | 140.8 ± 43.91 |
| **Merc 280** | 19.2 ± 1.5 | 6 ± 0.24 | 167.6 ± 6.91 |
| **Merc 280C** | 17.8 ± 3 | 6 ± 0.14 | 167.6 ± 27.11 |
| **Merc 450SE** | 16.4 ± 3 | 8 ± 0.34 | 275.8 ± 11.21 |
| **Merc 450SL** | 17.3 ± 2.8 | 8 ± 0.14 | 275.8 ± 32.21 |
| **Merc 450SLC** | 15.2 ± 0.3 | 8 ± 0.44 | 275.8 ± 11.61 |