通过反向融化重塑数据框

时间:2016-06-21 15:06:26

标签: r dataframe reshape melt

我有一个包含830和930两组观测值的数据集。我的目标是重塑我的数据框,以便有一个originID列,一列830和一个{{1 }}列,将930下的值保存在各自的小时列中。它基本上是一个反向重塑。有没有一种快速方法在R中执行此操作以及哪种包最合适?

walking

我从> df originId walking hour 1 359727104 3.440248 830 2 359931904 8.065233 830 3 229873828 3.519326 830 4 359931908 20.758961 830 5 359931909 15.050358 830 6 359727113 3.178191 830 1063 359727104 3.029167 930 1064 359931904 8.093116 930 1065 229873828 3.523732 930 1066 359931908 21.234964 930 1067 359931909 15.701993 930 1068 359727113 2.768297 930 尝试了这个公式,但它没有产生正确的结果。

reshape2

以下是数据样本:

> dcast(df, formula = originId + walking ~ hour)
Using hour as value column: use value.var to override.
    originId   walking 830 930
1  229873828  3.519326 830  NA
2  229873828  3.523732  NA 930
3  359727104  3.029167  NA 930
4  359727104  3.440248 830  NA
5  359727113  2.768297  NA 930
6  359727113  3.178191 830  NA
7  359931904  8.065233 830  NA
8  359931904  8.093116  NA 930
9  359931908 20.758961 830  NA
10 359931908 21.234964  NA 930
11 359931909 15.050358 830  NA
12 359931909 15.701993  NA 930

2 个答案:

答案 0 :(得分:0)

尝试tidyr

df %>% spread(hour, walking)

我建议您使用dplyr更改此类数字,这样您就不必处理以数字开头的列名:

df %>%
  mutate(hour = paste0('hour_', hour)) %>%
  spread(hour, walking)

答案 1 :(得分:0)

您需要使用walking - 变量作为value.var

dcast(df, originId ~ hour, value.var = 'walking')

给出:

   originId       830       930
1 229873828  3.519326  3.523732
2 359727104  3.440248  3.029167
3 359727113  3.178191  2.768297
4 359931904  8.065233  8.093116
5 359931908 20.758961 21.234964
6 359931909 15.050358 15.701993

甚至可能更好:

dcast(df, originId ~ paste0('hr_',hour), value.var = 'walking')

给出:

   originId    hr_830    hr_930
1 229873828  3.519326  3.523732
2 359727104  3.440248  3.029167
3 359727113  3.178191  2.768297
4 359931904  8.065233  8.093116
5 359931908 20.758961 21.234964
6 359931909 15.050358 15.701993