如何使用Tidyr在Tidyverse中转置(t)

时间:2017-11-05 20:16:43

标签: r dplyr tidyr tidyverse

使用示例数据(底部),我想使用下面的代码对数据进行分组和汇总。在此之后,我想转置,但我仍然坚持如何使用tidyr实现这一目标?

对于上下文,我正在尝试使用knitr :: kable重新创建在Excel中创建的现有表,因此我的代码的最终产品预计将打破整洁的原则。

例如:

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的gatherspread函数实现这一目标的整齐方法?我希望能够更好地控制该过程,并且还希望删除在使用转置(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)

2 个答案:

答案 0 :(得分:1)

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)

答案 1 :(得分:1)

tidyverse中的一般习语是将gather()数据放到最大程度,形成一个“长”数据帧,每行一次测量。然后,spread()可以将这个长数据帧恢复为您最喜欢的“宽”格式。此过程可以有效地转置数据:仅gather()所有标识符列行名称,然后spread()行名称。

例如,以下是如何有效转置mtcars

require(tidyverse)

mtcars %>% 
    rownames_to_column %>%
    gather(variable, value, -rowname) %>% 
    spread(rowname, value)

您的数据没有R中所理解的“行名称”,但Code1实际上充当行名,因为它唯一地标识了数据的每一(原始)行。

Df1 <- Df %>% 
    group_by(Code1, Code2, Level) %>%
    summarise_all(funs(count = sum(!is.na(.)))) %>%
    gather(column, value, -Code1) %>%
    spread(Code1, value)