【问题标题】:SUMIF with conditions on Dates in RSUMIF 与 R 中的日期条件
【发布时间】:2017-08-11 23:10:56
【问题描述】:

我有下表

**A**  | **B**  | **C** |**D** | **E**|
:----: | :----: | :----:|:----:|:----:|
1/1/17 | 3/1/17 |4/1/17 | H    |0.4   |
1/1/17 | 3/1/17 |4/1/17 | H    |0.2   |
2/1/17 | 4/1/17 |5/1/17 | V    |0.6   |
3/1/17 | 5/1/17 |6/1/17 | V    |0.8   |
4/1/17 | 5/1/17 |7/1/17 | H    |0.6   |
4/1/17 | 6/1/17 |7/1/17 | H    |0.2   |

这个想法是在soptfire中使用Spotfire,如果不是,然后是R。不幸的是,没有基本代码,因为我不确定如何将唯一日期中的单行数据与 A、B 和 C 中的一整列日期进行比较,并且总和值形成另一列 E。确实有我可以从中提取唯一日期值的初始部分。不要认为它有用,但将其包含在此处。

library(reshape2) 
mydata<-melt(dates,id=c("D")) 
mydata$value<-ymd(mydata$value)

Looking for the result as in the table below using R code
 1. Column with Unique list of dates from columns A,B & C above
 2. Sum of Column E where Column A dates <= Unique Dates value for each 
    columns A,B&C from the above table.
 3. Only Sum filtered by column D value of 'H' only

或 有没有办法在 Spotfire 中以唯一日期作为 X 轴并在 Y 轴上获得总和,而无需使用 Spotfire 中的 R 创建单独的表格,如下所示。

结果

**Unique Dates**  | **Sum for A** |  **Sum for B** | ** Sum for C**|
    :----:        |     :----:    |     :----:     |     :----:    |
    1/1/17        |      0.6      |       0        |       0       |
    2/1/17        |      0.6      |       0        |       0       |
    3/1/17        |      0.6      |      0.6       |       0       |
    4/1/17        |      1.4      |      0.6       |       0.6     |
    5/1/17        |      1.4      |      1.2       |       0.6     |
    6/1/17        |      1.4      |      1.4       |       0.6     |
    7/1/17        |      1.4      |      1.4       |       1.4     |

示例: 对于 A 列中 2017 年 3 月 1 日的唯一日期,它是 0.4+0.2=0.6 即仅对应于 A 中 2017 年 1 月 1 日的值,因为 2017 年 2 月 1 日在 D 列中有“V”。同样,对于 2017 年 2 月 1 日,它仍然是 0.6,因为正在添加 H 的唯一值。

【问题讨论】:

  • 我知道这是一个 R 问题,所以你的spotfire 标签可能是不必要的。您使用的是基础 R、dplyrdata.table 还是其他?我同意 Rich Scriven 的评论,请提供您的代码,否则看起来您很懒惰并要求我们为您完成所有工作。
  • @r2evans - 这个想法是在 soptfire 中使用 Spotfire,如果不是,则使用 R。我正在使用基本 R。不幸的是,没有基本代码,因为我不确定如何将唯一日期中的单行数据与 A、B 和 C 中的一整列日期和总和值形式进行比较另一列 E。确实有初始部分,我可以从中提取唯一的 Date 值。不要认为它有用,但将其包含在此处。 library(reshape2) mydata
  • 好的,很公平。就像在your previous question 中一样,提供可消耗的样本数据将是有益的。 (那里的答案为您完成了这项工作,尽管它确实应该在原始问题中完成。如果您简化它,您更有可能获得反馈和答案。)
  • @r2evans 我同意,将继续并将其添加到我的问题中。谢谢。
  • 您是如何获得 Sum for A 的结果的?具体来说,2017 年 5 月 1 日到 17 年 7 月 ...你能解释一下吗?

标签: r spotfire


【解决方案1】:

假设注释中的数据最后试试这个。没有使用任何包。

nms <- names(DF)[1:3]
fo <- E ~ A + time

DFH <- subset(DF, D == "H")
r <- reshape(DFH, varying = list(nms), times = nms, dir = "long")
xtabs(fo, aggregate(fo, r, sum))

给出以下内容 - 请注意,问题中的输出似乎与问题中的输入不对应,因此以下内容必然不同:

A          A   B   C
  1/1/17 0.6 0.0 0.0
  2/1/17 0.0 0.0 0.0
  3/1/17 0.0 0.6 0.0
  4/1/17 0.8 0.0 0.6
  5/1/17 0.0 0.6 0.0
  6/1/17 0.0 0.2 0.0
  7/1/17 0.0 0.0 0.8

这也可以表示为一个 magrittr 管道,其中 nmsfo 如上所述:

library(magrittr)

DF %>%
   subset(D == "H") %>%
   reshape(varying = list(nms), times = nms, dir = "long") %>%
   { aggregate(fo, ., sum) } %>%
   xtabs(formula = fo)

注意:输入数据:

Lines <- "
A      | B      |   C   |D     | E
:----: | :----: | :----:|:----:|:----:
1/1/17 | 3/1/17 |4/1/17 | H    |0.4   
1/1/17 | 3/1/17 |4/1/17 | H    |0.2   
2/1/17 | 4/1/17 |5/1/17 | V    |0.6   
3/1/17 | 5/1/17 |6/1/17 | V    |0.8   
4/1/17 | 5/1/17 |7/1/17 | H    |0.6   
4/1/17 | 6/1/17 |7/1/17 | H    |0.2   "
DF <- read.table(text = Lines, header = TRUE, check.names = FALSE,
   comment.char = ":", sep = "|", strip.white = TRUE)

【讨论】:

    【解决方案2】:

    我不明白你的帖子是如何得到结果的,但这应该可以通过Spotfire中的转换来完成

    1. File &gt; Add Date Tables &gt; Add (drop down on right) &gt; From Current Analysis: "Name of Your Original Data Table"
    2. Transformations &gt; Unpivot &gt; Add
    3. Columns to pass through: D, E
    4. Columns to transform: A, B, and C
    5. 点击OK

    然后,您只需要添加一个交叉表...这是您设置轴的方法

    1. 水平:[Category]
    2. 垂直:[Value]
    3. 单元格值:Sum([E])

    这会给你这些结果:

    【讨论】:

    • 感谢这有助于了解如何在 Spotfire 中进行反透视。但是 E 的总和不会真正执行 if Date in A
    • 因为想法是在 E 中添加值,并在 D 列中添加相应的“H”值。因此,对应于 2/1/2017 的 0.6 和对应于 2017 年 3 月 1 日的 0.8 已被忽略.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 2023-03-09
    • 2021-04-23
    • 2022-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多