我们以下面的数据帧为例:
df <- data.frame(state = c('up', 'up', 'up', 'down', 'down', 'up', 'down', 'down'), type = c('A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'))
要计算每种可能的A / B和上/下组合的发生次数,我会按如下方式进行计算:
a1 <- nrow(subset(subset(df, state == 'up'), type == 'A'))
a2 <- nrow(subset(subset(df, state == 'down'), type == 'A'))
a3 <- nrow(subset(subset(df, state == 'up'), type == 'B'))
a4 <- nrow(subset(subset(df, state == 'down'), type == 'B'))
并且要在Rmarkdown表中显示我会按如下方式执行:
| State/type | A | B |
|:--------------:|:------:|:------:|
| Up | `r a1` | `r a3` |
| Down | `r a2` | `r a4` |
我的问题是:有更好的方法吗?当你有许多因子组合并且规模很小时,这种方法变得非常繁琐。
答案 0 :(得分:1)
我们可以使用table
tbl <- table(df)
并将其转换为data.frame
as.data.frame.matrix(tbl)
或者如果我们还需要'state'列(而不是上面的行名)
library(tidyverse)
count(df, state, type) %>%
spread(type, n)
在rmarkdown中,以上内容可以用作
```{r echo = FALSE, include = FALSE, cache=FALSE}
df <- data.frame(state = c('up', 'up', 'up', 'down', 'down', 'up',
'down', 'down'), type = c('A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'))
library(dplyr)
library(tidyr)
library(kableExtra)
out <- count(df, state, type) %>%
spread(type, n)
```
```{r code1, results = 'asis', echo = FALSE}
kable(out, "html") %>%
kable_styling()
```