基于两列组合重排数据列:tidyr与dplyr实操问题
用tidyr和dplyr实现长格式转宽格式的解决方案
嘿,刚巧你正在学tidyr和dplyr,这俩包刚好能完美解决你这个长转宽的问题!我来一步步给你讲清楚怎么做:
首先,先把你的示例数据集用tidyverse的tibble构造出来(方便后续操作):
library(tidyverse) # 构造你的原始数据集 df <- tibble( `Factor 1` = c("A", "A", "B", "B"), `Factor 2` = c("green", "green", "yellow", "yellow"), Year = c(2016, 2017, 2017, 2018), value = c(1.2, 1.9, 3, 8) )
接下来用tidyr里的pivot_wider()函数(这是替代旧版spread()的更灵活函数)来完成转换,完全符合你想要的格式:
# 长转宽操作 wide_df <- df %>% pivot_wider( id_cols = c(`Factor 1`, `Factor 2`), # 用来分组的标识列 names_from = Year, # 要转成新列名的列 values_from = value, # 对应新列的值来源 names_prefix = "Year." # 给新列名加前缀"Year." ) # 查看结果 print(wide_df)
运行之后你会得到和你期望完全一致的输出:
# A tibble: 2 × 5 `Factor 1` `Factor 2` Year.2016 Year.2017 Year.2018 <chr> <chr> <dbl> <dbl> <dbl> 1 A green 1.2 1.9 NA 2 B yellow NA 3 8
简单解释下关键参数:
id_cols:指定哪些列是用来唯一标识每一行的(也就是不需要转换的分组列),这里就是Factor 1和Factor 2;names_from:把哪一列的取值变成新的列名,这里是Year;values_from:新列对应的值来自哪一列,这里是value;names_prefix:给新生成的列名加前缀,刚好满足你要的Year.2016这种格式。
之前用基础R函数没成功很正常,基础R的reshape()函数参数相对繁琐,而tidyverse的函数更贴合直观的思维逻辑,刚好适合你现在学习的方向~
内容的提问来源于stack exchange,提问作者gfmg1992
相关产品推荐
相关产品推荐

