這是我的資料框:
df <- tibble(x = c('a','a','a','a','a','b','b','b'), y = 1:8)
我想要這個最終輸出:
df_final <- tibble(x = c('a','a','a','a','a'), y = 1:5, x_1 = c('b','b','b',NA,NA), y_1 = c(6,7,8,NA,NA))
我如何使用pivot_wider函式來做到這一點?
uj5u.com熱心網友回復:
你要求的不是一個旋轉,試試這個。
library(dplyr)
library(purrr) # map_dfc
df %>%
split(., .$x) %>%
map_dfc(~ lapply(., `length<-`, max(table(df$x))))
# Warning: Outer names are only allowed for unnamed scalar atomic inputs
# New names:
# * x -> x...1
# * y -> y...2
# * x -> x...3
# * y -> y...4
# # A tibble: 5 x 4
# x...1 y...2 x...3 y...4
# <chr> <int> <chr> <int>
# 1 a 1 b 6
# 2 a 2 b 7
# 3 a 3 b 8
# 4 a 4 <NA> NA
# 5 a 5 <NA> NA
uj5u.com熱心網友回復:
另一種tidyverse解決方案。我們可以創建一個ID列 by x,拆分資料框 by x,使用reduce和left_join連接這些資料框。
library(tidyverse)
df2 <- df %>%
group_by(x) %>%
mutate(ID = 1:n()) %>%
split(.$x) %>%
reduce(.f = left_join, by = "ID") %>%
select(-ID) %>%
setNames(c("x", "y", "x_1", "y_1"))
df2
# # A tibble: 5 x 4
# x y x_1 y_1
# <chr> <int> <chr> <int>
# 1 a 1 b 6
# 2 a 2 b 7
# 3 a 3 b 8
# 4 a 4 NA NA
# 5 a 5 NA NA
uj5u.com熱心網友回復:
與tidyverse,
df %>% group_split(x) %>% reduce(merge, by = 0,all=T) %>% select(-1)
給,
x.x y.x x.y y.y
1 a 1 b 6
2 a 2 b 7
3 a 3 b 8
4 a 4 <NA> NA
5 a 5 <NA> NA
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/354143.html
