我想在 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
这没有做任何好事,只是添加了无用的行。
提前感谢您的帮助!
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
考虑以长格式重塑两次,然后以宽格式重塑:
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