r 中数据帧的重塑

问题描述 投票:0回答:2

我想在 R 中重塑数据框,并且我知道重塑函数或熔化应该可以解决问题, 但我不知道如何正确编写代码

我有一个像这样的数据框:

  X       date tim eric
1 a 2022-02-02   1    2
2 b 2022-02-02   3    4
3 a 2022-03-03   5    6
4 b 2022-03-03   7    8
a <- data.frame(X = rep(c("a","b"), 2),
                date = c(rep("2022-02-02",2), rep("2022-03-03",2)),
                tim = c(1,3,5,7),
                eric = c(2,4,6,8)
                )

我想要这样的形状:

     x       date a b
1  tim 2022-02-02 1 3
2 eric 2022-03-03 2 4
3  tim 2022-02-02 5 7
4 eric 2022-03-03 6 8

b <-data.frame(x = rep(c("tim", "eric"),2),
date = rep(c("2022-02-02","2022-03-03"),2),
a = c(1,2,5,6),
b= c(3,4,7,8)
)

你能帮我了解一下函数的语法吗?

我尝试过:

reshape(a,
varying = c("tim","eric"),
v.names = c("a", "b"),
direction = "long"
)
    X       date time a b id
1.1 a 2022-02-02    1 1 2  1
2.1 b 2022-02-02    1 3 4  2
3.1 a 2022-03-03    1 5 6  3
4.1 b 2022-03-03    1 7 8  4

这没有做任何好事,只是添加了无用的行。

提前感谢您的帮助!

r reshape
2个回答
0
投票

tidyverse
的方法是首先重塑为长,然后重塑为宽:

library(tidyr)

a |>
  pivot_longer(-c(X, date), names_to = "x") |>
  pivot_wider(names_from = X, values_from = value)
#> # A tibble: 4 × 4
#>   date       x         a     b
#>   <chr>      <chr> <dbl> <dbl>
#> 1 2022-02-02 tim       1     3
#> 2 2022-02-02 eric      2     4
#> 3 2022-03-03 tim       5     7
#> 4 2022-03-03 eric      6     8

0
投票

考虑以长格式重塑两次,然后以宽格式重塑:

new_df <- reshape(
  a,
  idvar = c("X", "date"),
  varying = c("tim", "eric"),
  times = c("tim", "eric"),
  v.names = "value",
  timevar = "name",
  direction = "long",
  new.row.names = 1:1E5
) |> reshape(
  idvar = c("name", "date"),
  v.names = "value",
  timevar = "X",
  direction = "wide"
) 

colnames(new_df) <- gsub(
  "value\\.", "", colnames(new_df)
)

new_df
#         date name a b
# 1 2022-02-02  tim 1 3
# 3 2022-03-03  tim 5 7
# 5 2022-02-02 eric 2 4
# 7 2022-03-03 eric 6 8
© www.soinside.com 2019 - 2024. All rights reserved.