如何使第一个数据集看起来像第二个数据集?
我正在尝试使用 dplyrivot_longer 函数,但没有任何运气。下面是一个示例数据集,它反射(reflect)了包含 50 多列的更大的数据集。
Reshaping data.frame from wide to long format
library(tidyverse)
df1
#> # A tibble: 9 x 6
#> column_label val1 val2 cat1 cat2 cat3
#> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
#> 1 2 0.989 9.89 0 NA <NA>
#> 2 2 0.622 6.22 1 NA <NA>
#> 3 3 0.619 6.19 NA 0 <NA>
#> 4 3 0.119 1.19 NA 1 <NA>
#> 5 10 0.407 4.07 NA NA BABY BOOMERS
#> 6 10 0.800 8.00 NA NA GEN Z
#> 7 10 0.305 3.05 NA NA GENERATION X
#> 8 10 0.158 1.58 NA NA MILLENNIALS
#> 9 10 0.439 4.39 NA NA SILENT GENERATION
# how do you pivot_longer to create this data set?
df2
#> # A tibble: 9 x 5
#> column_label val1 val2 variables Values
#> <dbl> <dbl> <dbl> <chr> <chr>
#> 1 2 0.989 9.89 cat1 0
#> 2 2 0.622 6.22 cat1 1
#> 3 3 0.619 6.19 cat2 0
#> 4 3 0.119 1.19 cat2 1
#> 5 10 0.407 4.07 cat3 BABY BOOMERS
#> 6 10 0.800 8.00 cat3 GEN Z
#> 7 10 0.305 3.05 cat3 GENERATION X
#> 8 10 0.158 1.58 cat3 MILLENNIALS
#> 9 10 0.439 4.39 cat3 SILENT GENERATION
数据
df1 <- structure(list(column_label = c(2, 2, 3, 3, 10, 10, 10, 10, 10
), val1 = c(0.989049526, 0.622384581, 0.618576065, 0.11864823,
0.406763475, 0.799564365, 0.3053153, 0.158456912, 0.438528606
), val2 = c(9.890495264, 6.223845807, 6.185760647, 1.186482297,
4.067634747, 7.995643651, 3.053153001, 1.584569123, 4.385286057
), cat1 = c(0, 1, NA, NA, NA, NA, NA, NA, NA), cat2 = c(NA, NA,
0, 1, NA, NA, NA, NA, NA), cat3 = c(NA, NA, NA, NA, "BABY BOOMERS",
"GEN Z", "GENERATION X", "MILLENNIALS", "SILENT GENERATION")), class = c("spec_tbl_df",
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -9L), spec = structure(list(
cols = list(column_label = structure(list(), class = c("collector_double",
"collector")), val1 = structure(list(), class = c("collector_double",
"collector")), val2 = structure(list(), class = c("collector_double",
"collector")), cat1 = structure(list(), class = c("collector_double",
"collector")), cat2 = structure(list(), class = c("collector_double",
"collector")), cat3 = structure(list(), class = c("collector_character",
"collector"))), default = structure(list(), class = c("collector_guess",
"collector")), skip = 1), class = "col_spec"))
df2 <- structure(list(column_label = c(2, 2, 3, 3, 10, 10, 10, 10, 10
), val1 = c(0.989049526, 0.622384581, 0.618576065, 0.11864823,
0.406763475, 0.799564365, 0.3053153, 0.158456912, 0.438528606
), val2 = c(9.890495264, 6.223845807, 6.185760647, 1.186482297,
4.067634747, 7.995643651, 3.053153001, 1.584569123, 4.385286057
), variables = c("cat1", "cat1", "cat2", "cat2", "cat3", "cat3",
"cat3", "cat3", "cat3"), Values = c("0", "1", "0", "1", "BABY BOOMERS",
"GEN Z", "GENERATION X", "MILLENNIALS", "SILENT GENERATION")), class = c("spec_tbl_df",
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -9L), spec = structure(list(
cols = list(column_label = structure(list(), class = c("collector_double",
"collector")), val1 = structure(list(), class = c("collector_double",
"collector")), val2 = structure(list(), class = c("collector_double",
"collector")), variables = structure(list(), class = c("collector_character",
"collector")), Values = structure(list(), class = c("collector_character",
"collector"))), default = structure(list(), class = c("collector_guess",
"collector")), skip = 1), class = "col_spec"))
由 pivot_longer with multiple classes causes error ("No common type") (v0.3.0) 于 2020 年 3 月 13 日创建
最佳答案
您在pivot_longer
中选择的列没有通用类型,即cat1
和cat2
是数字,cat3
是性格。您可以提前将它们全部转换为字符,或使用参数 values_ptypes
指定类型。
df1 %>%
pivot_longer(cat1:cat3,
names_to = 'variables', values_to = 'Values',
values_drop_na = TRUE,
values_ptypes = list(Values = character()))
# # A tibble: 9 x 5
# column_label val1 val2 variables Values
# <dbl> <dbl> <dbl> <chr> <chr>
# 1 2 0.989 9.89 cat1 0
# 2 2 0.622 6.22 cat1 1
# 3 3 0.619 6.19 cat2 0
# 4 3 0.119 1.19 cat2 1
# 5 10 0.407 4.07 cat3 BABY BOOMERS
# 6 10 0.800 8.00 cat3 GEN Z
# 7 10 0.305 3.05 cat3 GENERATION X
# 8 10 0.158 1.58 cat3 MILLENNIALS
# 9 10 0.439 4.39 cat3 SILENT GENERATION
关于r - 当列没有通用类型时如何延长数据集的旋转时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60676491/