【问题标题】:Pivot longer into 3 columns旋转更长的时间进入 3 列
【发布时间】:2020-11-21 12:01:15
【问题描述】:

我有一个 df,其中包含 1000 多列日期(从 2017 年 1 月 1 日到 2020 年 1 月 1 日),以及 500 多个供应商的行,其中填充了每个供应商的每日销售额。 我想将它分成 3 行(供应商、日期和每日销售额),但无法理解 pivot_longer 对 2 列以上输出的工作方式。

我有什么:

+------------+------------+------------+------------+------------+
|  Provider  | 2017-01-01 | 2017-01-02 | 2017-01-03 | 2017-01-04 |
+------------+------------+------------+------------+------------+
| Nestle     |         12 |         10 |          8 |         12 |
| Heineken   |          - |          3 |          1 |          3 |
| Hagen Dazs |          5 |          - |          - |          2 |
+------------+------------+------------+------------+------------+

我想要的输出:

|  Provider  |    Date    | Sales |
+------------+------------+-------+
| Nestle     | 2017-01-01 |    12 |
| Nestle     | 2017-01-02 |     8 |
| Nestle     | 2017-01-03 |    10 |
| Nestle     | 2017-01-04 |    12 |
| Heineken   | 2017-01-02 |     3 |
| Heineken   | 2017-01-03 |     1 |
| Heineken   | 2017-01-04 |     3 |
| Hagen Dazs | 2017-01-01 |     5 |
| Hagen Dazs | 2017-01-04 |     2 |
+------------+------------+-------+

【问题讨论】:

  • 我认为pivot_longer(df, -1) 应该可以解决问题。

标签: r date pivot-table


【解决方案1】:

从技术上讲,@AllanCameron 的伟大建议可以做到这一点。您只需要完善它,为- 添加一个过滤器,并在需要时将变量格式化为数字:

library(dplyr)
library(tidyr)
#Code
newdf <- df %>% pivot_longer(-Provider) %>%
  filter(value!='-') %>% mutate(value=as.numeric(value))

输出:

# A tibble: 9 x 3
  Provider   name       value
  <chr>      <chr>      <dbl>
1 Nestle     2017-01-01    12
2 Nestle     2017-01-02    10
3 Nestle     2017-01-03     8
4 Nestle     2017-01-04    12
5 Heineken   2017-01-02     3
6 Heineken   2017-01-03     1
7 Heineken   2017-01-04     3
8 Hagen Dazs 2017-01-01     5
9 Hagen Dazs 2017-01-04     2

使用的一些数据:

#Data
df <- structure(list(Provider = c("Nestle", "Heineken", "Hagen Dazs"
), `2017-01-01` = c("12", "-", "5"), `2017-01-02` = c("10", "3", 
"-"), `2017-01-03` = c("8", "1", "-"), `2017-01-04` = c("12", 
"3", "2")), row.names = c(NA, -3L), class = "data.frame")

【讨论】:

    【解决方案2】:

    melt 的选项

    library(reshape2)
    library(dplyr)
    df %>%
        melt(id.var = 'Provider') %>% 
        mutate(value = replace(value, value == '-', NA)) %>% 
        type.convert(as.is = TRUE)
    

    数据

    df <- structure(list(Provider = c("Nestle", "Heineken", "Hagen Dazs"
    ), `2017-01-01` = c("12", "-", "5"), `2017-01-02` = c("10", "3", 
    "-"), `2017-01-03` = c("8", "1", "-"), `2017-01-04` = c("12", 
    "3", "2")), row.names = c(NA, -3L), class = "data.frame")
    

    【讨论】:

      猜你喜欢
      • 2021-12-27
      • 1970-01-01
      • 2020-06-12
      • 2015-01-30
      • 1970-01-01
      • 2021-06-04
      • 2023-01-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多