【问题标题】:Reshaping a data frame by reverse melt通过反向融化重塑数据框
【发布时间】:2016-06-21 15:06:25
【问题描述】:

我有一个数据集,其中包含 830 和 930 的两组观察值。我的目标是重塑我的数据框,以便有一个 originID 列、一个 830 列和一个 930 列,保持walking 下的值在各自的小时列中。它基本上是一个反向重塑。在 R 中有没有一种快速的方法可以做到这一点,什么包最合适?

> 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

以下是数据示例:

> dput(df)
structure(list(originId = c(359727104, 359931904, 229873828, 
359931908, 359931909, 359727113, 359727104, 359931904, 229873828, 
359931908, 359931909, 359727113), walking = c(3.44024822695035, 
8.06523297491039, 3.51932624113475, 20.7589605734767, 15.0503584229391, 
3.1781914893617, 3.02916666666667, 8.09311594202899, 3.52373188405797, 
21.2349637681159, 15.7019927536232, 2.76829710144928), hour = c(830L, 
830L, 830L, 830L, 830L, 830L, 930L, 930L, 930L, 930L, 930L, 930L
)), .Names = c("originId", "walking", "hour"), row.names = c(1L, 
2L, 3L, 4L, 5L, 6L, 1063L, 1064L, 1065L, 1066L, 1067L, 1068L), class = "data.frame")

【问题讨论】:

  • 你需要使用walking变量作为你的value.var:dcast(df, formula = originId ~ hour, value.var = 'walking')

标签: r dataframe reshape melt


【解决方案1】:

您需要使用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

【讨论】:

    【解决方案2】:

    试试tidyr:

    df %>% spread(hour, walking)
    

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

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

    【讨论】:

    • 尝试此操作时出现以下错误:utils::getS3method("as_data_frame", "matrix", envir = asNamespace("tibble")) 中的错误:未使用的参数 (envir = asNamespace("小标题")) –
    • 尝试重新启动您的 R 会话并仅加载所需的包。如果有效,则存在冲突。
    猜你喜欢
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    相关资源
    最近更新 更多