【问题标题】:Values comparison under columns combinations列组合下的值比较
【发布时间】:2017-05-27 19:47:59
【问题描述】:

我有以下类型的数据框:

date       ID1   ID2    sum
2017-1-5    1     a     200
2017-1-5    1     b     150
2017-1-5    2     a     300
2017-1-4    1     a     200
2017-1-4    1     b     120
2017-1-4    2     a     300
2017-1-3    1     b     150

我正在尝试比较不同日期的列组合,以查看 sum 值是否相等。因此,在上述示例中,我希望代码识别出 [ID1=1, ID2=b] 组合的总和在 2017-1-5 和 2017-1-4 之间是不同的(在我的真实数据中,我有超过 2 个 @ 987654325@ 类别和超过 2 个Dates)。

我希望我的输出是一个数据框,其中包含所有包含(至少一个)不相等结果的组合。在我的例子中:

date       ID1   ID2    sum
2017-1-5    1     b     150
2017-1-4    1     b     120
2017-1-3    1     b     150

我尝试使用这样的循环来解决它:Is there a R function that applies a function to each pair of columns,但没有取得很大成功。

您的帮助将不胜感激。

【问题讨论】:

  • 你希望你的输出是什么样子的?如果您有两个以上 ID 组合的日期,您是否只想指出它们是否都相同?或者,您想识别唯一的,还是什么?
  • 我想标记总和不相等的组合;例如,一个看起来像这样的数据框:(行;date)和(列;ID1,ID2,sum)......所以在我的例子中:(第一行=2017-1-5) (2nd row=2017-1-4) and (1st col=ID1) (2nd col=ID2) (3rd col=sum)...这两个单元格将显示150和120。希望很清楚..我可能会改变我的问题..
  • 如果您有三个日期,其中两个具有相同的和,而第三个不一样怎么办?那么你想在你的输出中标记这两者中的哪一个?
  • 我改变了我的问题(两次:))。我希望现在更清楚了。非常感谢!

标签: r comparison date-comparison


【解决方案1】:

使用dplyr,我们可以group_by_(.dots=paste0("ID",1:2)),然后查看值是否为unique:

library(dplyr)
res <- df %>% group_by_(.dots=paste0("ID",1:2)) %>% 
              mutate(flag=(length(unique(sum))==1)) %>%
              ungroup() %>% filter(flag==FALSE) %>% select(-flag)

group_by_ 允许您轻松地对多个 ID 列进行分组。只需将2 更改为许多ID 列(即N),假设它们从1 到N 连续编号。创建 flag 列以指示所有值是否相同(即,unique 值的数量为 1)。然后我们filter 获取flag==FALSE 的结果。这给出了预期的结果:

res
### A tibble: 3 x 4
##      date   ID1   ID2   sum
##     <chr> <int> <chr> <int>
##1 2017-1-5     1     b   150
##2 2017-1-4     1     b   120
##3 2017-1-3     1     b   150

【讨论】:

  • 太棒了。谢谢!还有一件事.. 有没有办法flag 只差大于总和整数;例如,大于 50(在我的示例中不会产生任何结果)?
  • 如果您有兴趣在每个组中标记大于50 的sum 值范围,那么您可以在mutate 内使用flag=(max(sum)-min(sum))&lt;=50 而不是flag=(length(unique(sum))==1)。这会将sum 值范围小于或等于50 的组设置为TRUE,以便仅保留范围大于50 的组。
  • 再次令人惊叹。非常非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 2014-08-27
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多