如何使用 Tidyr 在 Tidyverse 中转置 (t)
How to Transpose (t) in the Tidyverse Using Tidyr
使用示例数据(底部),我想使用下面的代码对数据进行分组和汇总。在此之后,我想转置,但我一直停留在如何使用 tidyr 来实现这一点?
对于上下文,我正在尝试使用 knitr::kable 重新创建在 Excel 中创建的现有 table,因此我下面的代码的最终产品预计会破坏整洁原则。
例如:
library(tidyverse)
Df <- Df %>% group_by(Code1, Code2, Level) %>%
summarise_all(funs(count = sum(!is.na(.))))
我可以使用管道添加 t(.)...
Df <- Df %>% group_by(Code1, Code2, Level) %>%
summarise_all(funs(count = sum(!is.na(.)))) %>%
t(.)
或者我可以添加...
Df <- as.data.frame(t(Df)
这两个选项都允许我转置,但我想知道是否有使用 tidyr 的 gather
和 spread
函数实现此目的的 tidyverse 方法?我想更好地控制该过程,还想删除在使用转置 (t
) 时显示为列名的 "V1"、"V2" 等。
如何使用 tidyverse 实现此目的?
示例代码:
Code1 <- c("H200","H350","H250","T400","T240","T600")
Code2 <- c("4A","4A","4A","2B","2B","2B")
Level <- c(1,2,3,1,2,3)
Q1 <- c(30,40,40,50,60,80)
Q2 <- c(50,30,50,40,80,30)
Q3 <- c(30,45,70,42,81,34)
Df <- data.frame(Code1, Code2, Level, Q1, Q2, Q3)
library(tidyr)
library(dplyr)
Df <- Df %>% group_by(Code1, Code2, Level) %>%
summarise_all(funs(count = sum(!is.na(.)))) %>%
gather(var, val, 2:ncol(Df)) %>%
spread(Code1, val)
tidyverse 中的一般习语是 gather()
你的数据到最大范围,形成一个 "long" 数据框,每行一个测量。然后,spread()
可以将这个长数据帧恢复为您最喜欢的 "wide" 格式。此过程可以有效地转置数据:只是 gather()
所有标识符列 除了 行名称,然后是 spread()
行名称。
例如,这里是如何有效地转置 mtcars
:
require(tidyverse)
mtcars %>%
rownames_to_column %>%
gather(variable, value, -rowname) %>%
spread(rowname, value)
您的数据没有 R 中理解的 "row names",但 Code1
有效地用作行名称,因为它唯一标识数据的每个(原始)行。
Df1 <- Df %>%
group_by(Code1, Code2, Level) %>%
summarise_all(funs(count = sum(!is.na(.)))) %>%
gather(column, value, -Code1) %>%
spread(Code1, value)
tidyr 1.0 或更高版本的更新(2019 年末开始)
新的 pivot_wider()
和 pivot_longer()
函数现在优于旧的(但仍受支持)gather()
和 spread()
。因此转置 mtcars 的首选方法可能是
require(tidyverse)
mtcars %>%
rownames_to_column() %>%
pivot_longer(-rowname, 'variable', 'value') %>%
pivot_wider(variable, rowname)
使用示例数据(底部),我想使用下面的代码对数据进行分组和汇总。在此之后,我想转置,但我一直停留在如何使用 tidyr 来实现这一点?
对于上下文,我正在尝试使用 knitr::kable 重新创建在 Excel 中创建的现有 table,因此我下面的代码的最终产品预计会破坏整洁原则。
例如:
library(tidyverse)
Df <- Df %>% group_by(Code1, Code2, Level) %>%
summarise_all(funs(count = sum(!is.na(.))))
我可以使用管道添加 t(.)...
Df <- Df %>% group_by(Code1, Code2, Level) %>%
summarise_all(funs(count = sum(!is.na(.)))) %>%
t(.)
或者我可以添加...
Df <- as.data.frame(t(Df)
这两个选项都允许我转置,但我想知道是否有使用 tidyr 的 gather
和 spread
函数实现此目的的 tidyverse 方法?我想更好地控制该过程,还想删除在使用转置 (t
) 时显示为列名的 "V1"、"V2" 等。
如何使用 tidyverse 实现此目的?
示例代码:
Code1 <- c("H200","H350","H250","T400","T240","T600")
Code2 <- c("4A","4A","4A","2B","2B","2B")
Level <- c(1,2,3,1,2,3)
Q1 <- c(30,40,40,50,60,80)
Q2 <- c(50,30,50,40,80,30)
Q3 <- c(30,45,70,42,81,34)
Df <- data.frame(Code1, Code2, Level, Q1, Q2, Q3)
library(tidyr)
library(dplyr)
Df <- Df %>% group_by(Code1, Code2, Level) %>%
summarise_all(funs(count = sum(!is.na(.)))) %>%
gather(var, val, 2:ncol(Df)) %>%
spread(Code1, val)
tidyverse 中的一般习语是 gather()
你的数据到最大范围,形成一个 "long" 数据框,每行一个测量。然后,spread()
可以将这个长数据帧恢复为您最喜欢的 "wide" 格式。此过程可以有效地转置数据:只是 gather()
所有标识符列 除了 行名称,然后是 spread()
行名称。
例如,这里是如何有效地转置 mtcars
:
require(tidyverse)
mtcars %>%
rownames_to_column %>%
gather(variable, value, -rowname) %>%
spread(rowname, value)
您的数据没有 R 中理解的 "row names",但 Code1
有效地用作行名称,因为它唯一标识数据的每个(原始)行。
Df1 <- Df %>%
group_by(Code1, Code2, Level) %>%
summarise_all(funs(count = sum(!is.na(.)))) %>%
gather(column, value, -Code1) %>%
spread(Code1, value)
tidyr 1.0 或更高版本的更新(2019 年末开始)
新的 pivot_wider()
和 pivot_longer()
函数现在优于旧的(但仍受支持)gather()
和 spread()
。因此转置 mtcars 的首选方法可能是
require(tidyverse)
mtcars %>%
rownames_to_column() %>%
pivot_longer(-rowname, 'variable', 'value') %>%
pivot_wider(variable, rowname)