r - 旋转更长的多列,同时旋转更宽的其他列

标签 r dplyr pivot data-manipulation

你好,我有一个数据集,每组 3-5 行,如下所示,我想以更长的格式放置一些列,并以更宽的格式放置列。

下面的第一个数据集代表原始格式,我想将其转换为第二个。我使用了 pivot wider cols = c("Jan", "Feb") 但我无法同时将 Type 列旋转得更长。

data <- as.data.frame(matrix(ncol=5, nrow=6))
colnames(data) <- c("names", "group", "Type", "Jan", "Feb")
data$names <- c("P1", "P1", "P1", "P2", "P2", "P2")
data$group <- "S"
data$Type <- c("Beg", "Middle", "End", "Beg", "Middle", "End")
data$Jan <- c(1, 2, 3, 10, 5, 15)
data$Feb <- c(5, 5, 10, 5, 2, 7)

    
   names group Type     Jan  Feb
1   P1    S    Beg       1   5
2   P1    S    Middle    2   5
3   P1    S    End       3   10
4   P2    S    Beg       10  5
5   P2    S    Middle    5   2
6   P2    S    End       15  7


data_transformed <- as.data.frame(matrix(ncol=6, nrow=4))
colnames(data_transformed) <- c("names", "group", "Month", "Beg", "Middle", "End")
data_transformed$names <- c("P1", "P1", "P2", "P2")
data_transformed$group <- "S"
data_transformed$Month <- c("Jan", "Feb")
data_transformed$Beg <- c(1, 10, 5, 5)
data_transformed$Middle <- c(2, 5, 5, 2)
data_transformed$End <- c(2, 15, 10, 7)

  names group Month   Beg Middle End
1   P1  S     Jan      1    2    2
2   P1  S     Feb      10   5    15
3   P2  S     Jan      5    5    10
4   P2  S     Feb      5    2    7

最佳答案

在这里,我们需要一个 pivot_longer + pivot_wider 即首先使用 colJan reshape 为“长”到“Feb”,然后使用“Type”中的列名将长格式改回更宽的格式

library(dplyr)
library(tidyr)
data %>%
     pivot_longer(cols = Jan:Feb, names_to = 'Month') %>% 
     pivot_wider(names_from = Type, values_from = value)

-输出

# A tibble: 4 x 6
#  names group Month   Beg Middle   End
#  <chr> <chr> <chr> <dbl>  <dbl> <dbl>
#1 P1    S     Jan       1      2     3
#2 P1    S     Feb       5      5    10
#3 P2    S     Jan      10      5    15
#4 P2    S     Feb       5      2     7

或者使用reshape2中的recast

library(reshape2)
recast(data, measure = c("Jan", "Feb"),
     names + group + variable ~ Type, values.var = 'value')

关于r - 旋转更长的多列,同时旋转更宽的其他列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66294276/

相关文章:

r - 将 mutate(across(...)) 与 purrr::map 结合使用

r - 有没有办法在 R 中的数据框组内创建索引?

regex - R dplyr : rename variables using string functions

sql - 如何将一列与相关列进行旋转?

SQL查询将表分组为表的表?

r - 将十进制日转换为 HH :MM

r - 使用 R 和 tidyverse 将 tidy 表转换为深度嵌套列表

linux - 在 R 中执行 library(package) 报告包是为 i386 构建的,它可以安装在 x86_64 系统上吗?

sql - PIVOT Oracle - 将多行数据转换为具有多列的单行,无聚合数据

r - 从数据帧列表创建平均数据帧