r - 在R中将行扩展到多列
问题描述
我正在尝试创建一个数据透视表,并且在获取输出时遇到了一些问题。我与包无关,我尝试过 reshape2、tidry 和 dplyr,但没有任何工作。
到目前为止,我的尝试都出错了,我还设法收集数据以将填充和目标删除到一个名为“类型”的新变量中,值是“座位......但这似乎也无济于事.
mynewdf = gather(mydf,Type,Seats,c("Fill","Target"))
我认为接近工作的代码......
t=dcast(mydf, Date + Type + Month ~ Seats, length, drop=FALSE)
我当前的数据结构如下所示:
Date Month Fill Target Code
1234 Jan 14 15 13B
1234 Feb 12 14 13B
.................
1235 Oct 13 16 13F
永远不应该有任何重复的日期/月份/代码,我最终要显示的是填充和目标(最终会做一些计算字段,但我稍后会越过那座桥)。
我希望输出为:
Jan Feb ....... Oct .....
Date Fill Target Fill Target ....... Fill Target.... MOS
1234 14 15 12 14 ....................... 13B
1235 ......................................13 16 ..... 13F
我尝试按月和填充分组,然后按月和目标分组,但没有运气。
解决方案
答案比我想的要冗长一些,但这应该给你一个开始。
首先输入您显示的数据框:
library(dplyr); library(tidyr)
mydf <- data.frame(Date = c(1234, 1234, 1235),
Month = c('Jan', 'Feb', 'Oct'),
Fill = c(14, 12, 13),
Target = c(15, 14, 16),
Code = c('13B', '13B', '13F'))
然后开始数据争论tidyr::unite()
:
> newdf <- mydf %>%
+ tidyr::unite(Fill_Target, Fill, Target, sep='_')
> newdf
Date Month Fill_Target Code
1 1234 Jan 14_15 13B
2 1234 Feb 12_14 13B
3 1235 Oct 13_16 13F
因此,您将 Fill 和 Target 变量组合成一列。这样做,您可以使用tidyr::spread
:
> newdf <- newdf %>% tidyr::spread(Month, Fill_Target)
> newdf
Date Code Feb Jan Oct
1 1234 13B 12_14 14_15 <NA>
2 1235 13F <NA> <NA> 13_16
所以在这里你有日期和代码,然后是你的月份,然后是 Fill_Target 值。然后使用tidyr::separate()
将它们分成单独的列:
> newdf <- newdf %>%
+ tidyr::separate(Jan, into = c('Jan_Fill', 'Jan_Target')) %>%
+ tidyr::separate(Feb, into = c('Feb_Fill', 'Feb_Target')) %>%
+ tidyr::separate(Oct, into = c('Oct_Fill', 'Oct_Target'))
> newdf
Date Code Feb_Fill Feb_Target Jan_Fill Jan_Target Oct_Fill Oct_Target
1 1234 13B 12 14 14 15 <NA> <NA>
2 1235 13F <NA> <NA> <NA> <NA> 13 16
然后您可以使用dplyr::select()
重新排序列
> newdf %>%
+ select(Date, Jan_Fill, Jan_Target, Feb_Fill, Feb_Target, Oct_Fill, Oct_Target,
+ Code)
Date Jan_Fill Jan_Target Feb_Fill Feb_Target Oct_Fill Oct_Target Code
1 1234 14 15 12 14 <NA> <NA> 13B
2 1235 <NA> <NA> <NA> <NA> 13 16 13F
现在,我不喜欢这个答案,因为它有点冗长,尤其是当您考虑到您将有 12 个月的时间时。但是,对于您来说,在代码中稍微冗长和深思熟虑可能会更容易/更好,而不是弄乱准引用并尝试以更奇特的方式分隔和选择月份。
另外,我注意到只有一行“标题”,而不是你的两行。不幸的是,如果你想要第二个标题行,你将不得不使用 Python Pandas;R 不支持这一点。
推荐阅读
- javascript - 如何将渐变填充应用于matter.js中的对象
- azure - 无法理解对网站服务器的 /null GET 请求
- python - 2checkout Python中的IPN示例验证响应
- python - 基于第一列值的 Pandas DataFrame Wide to Long
- macos - spindump 和流程样本有什么区别?
- python - 减少上传 Django 时的音频、视频大小
- bash - 随机改组多个文本文件中的行,但使用命令或 bash 脚本将它们保留为单独的文件
- c++ - 如何将成员函数传递给需要函数指针的函数?
- c# - C# 生成的 Stimulsoft 报告中未设置数据源
- operating-system - 尝试启动rom