【问题标题】:Return record where frequency count does not match [duplicate]返回频率计数不匹配的记录[重复]
【发布时间】:2018-06-01 05:59:48
【问题描述】:

我正在研究 R 中的数据集,其中 WO 可以具有值“K”和“B”。我希望在每个 WO 的频率在“K”和“B”记录之间不匹配的情况下返回 WO。例如下表:

df <- structure(list(WO = c(917595L, 917595L, 1011033L, 1011033L), 
    Invoice = c("B", "K", "B", "K"), freq = c(3L, 6L, 2L, 2L)),
    .Names = c("WO", "Invoice", "freq"),
    class = "data.frame", row.names = c(NA, -4L)
)

我希望返回 917595,因为 3 不等于 6。但是,应该返回 1011033,因为它的频率匹配。

【问题讨论】:

  • 917595 在 K、B 记录之间的频率不同:您希望它返回还是不返回?但是您说您希望返回 1011033,因为它的频率 确实 匹配。我很困惑...

标签: r


【解决方案1】:

重塑数据让您可以对频率值进行比较。

library(dplyr)
library(reshape2)

dframe <- 
  "WO,Invoice,freq
917595,B,3
917595,K,6
1011033,B,2
1011033,K,2" %>% 
  read.csv(text = .,
           stringsAsFactors = FALSE) 

  dcast(dframe,
        WO ~ Invoice,
        value.var = "freq") %>% 
  filter(B != K)

【讨论】:

  • 谢谢,我有大约 60,000 条记录并将其作为数据框,上面的代码是否可以正常工作?谢谢。
  • 如果数据与您提供的样本数据结构相同,我认为这不是问题。
  • 我返回的值并没有给我 WO。我首先虽然它是索引,但它不是。
  • 检查WO的类。是不是偶然factor
  • 这是一个因素。它需要是什么类?
【解决方案2】:

我们可以通过 base R 使用 duplicated 来做到这一点

df1[!(duplicated(df1[c(1, 3)])|duplicated(df1[c(1,3)], fromLast = TRUE)),]
#      WO Invoice freq
#1 917595       B    3
#2 917595       K    6

或者另一种选择是按 'WO' 分组并检查 if 'freq' 中 unique 元素的数量是否大于 1

library(data.table)
setDT(df1)[, if(uniqueN(freq)>1) .SD, WO]
#       WO Invoice freq
#1: 917595       B    3
#2: 917595       K    6

【讨论】:

    猜你喜欢
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 2013-06-03
    • 2021-02-06
    相关资源
    最近更新 更多