【问题标题】:Satisfying condition for another column满足另一列的条件
【发布时间】:2018-02-03 16:39:45
【问题描述】:

我已经阅读了多个问题,但没有找到一些有效的代码,非常感谢您的帮助。这是对早期问题的改进,虽然我可以在 Excel 中做到这一点,但我正在努力让我的 R 跟上速度。

我有一些让我头疼的销售数据:

date    sales
14/11   39
14/11   3.2
14/11   13
14/11   8.3
14/11   5
14/11   5.6
14/11   79
14/11   35
14/11   24
14/11   8.1
14/11   21
14/11   40
14/11   50
14/11   82
15/11   8.3
15/11   7.2
15/11   63
15/11   31
15/11   35
15/11   2.1
15/11   31
15/11   11
15/11   3.8
15/11   29
15/11   NA

已经向我展示了如何对日期进行分组并找到表现最差的三名,但我想保持其余数据可见。

我希望看到另一个列,其中排名靠前的三个销售报告显示为 TRUE,如果不是,则为 FALSE

我试过了:

if(data$sales == group_by(data$date)%>%top_n(n=-3, wt=sales)) {
data$top <- T
} else {
dat$top <- F
}

我得到的只是:

Error in UseMethod("group_by_") : 
no applicable method for 'group_by_' applied to an object of class "factor"

这也不是第一次尝试——我尝试过 for 循环,如果 |否则,匹配,%in% 并且真的很挣扎,但不想在这里倾倒一大堆糟糕的代码。

非常感谢任何想法。

【问题讨论】:

    标签: r


    【解决方案1】:

    应该这样做:

    library(dplyr)
    
    df %>% 
      group_by(date) %>% 
      mutate(bottom3 = ifelse(rank(sales) <= 3, TRUE, FALSE))
    
    # A tibble: 25 x 3
    # Groups:   date [2]
       date  sales bottom3
       <chr> <dbl> <lgl>  
     1 15/11  2.10 T      
     2 14/11  3.20 T      
     3 15/11  3.80 T      
     4 14/11  5.00 T      
     5 14/11  5.60 T      
     6 15/11  7.20 T      
     7 14/11  8.10 F      
     8 14/11  8.30 F      
     9 15/11  8.30 F      
    10 15/11 11.0  F      
    # ... with 15 more rows
    

    【讨论】:

    • 我已经清理了数据并将所有销售额更改为 as.numeric(as.character)) 但我在第三列中得到的仍然是 F 。有什么想法吗?
    【解决方案2】:

    希望这会有所帮助!

    library(dplyr)
    
    df %>%
      group_by(date) %>%
      arrange(date, sales) %>%
      mutate(bottom3_performer = row_number() <=3)
    

    输出是:

        date sales bottom3_performer
    1  14/11   3.2              TRUE
    2  14/11   5.0              TRUE
    3  14/11   5.6              TRUE
    4  14/11   8.1             FALSE
    5  14/11   8.3             FALSE
    6  14/11  13.0             FALSE
    7  14/11  21.0             FALSE
    ...
    

    样本数据:

    df <- structure(list(date = c("14/11", "14/11", "14/11", "14/11", "14/11", 
    "14/11", "14/11", "14/11", "14/11", "14/11", "14/11", "14/11", 
    "14/11", "14/11", "15/11", "15/11", "15/11", "15/11", "15/11", 
    "15/11", "15/11", "15/11", "15/11", "15/11", "15/11"), sales = c(39, 
    3.2, 13, 8.3, 5, 5.6, 79, 35, 24, 8.1, 21, 40, 50, 82, 8.3, 7.2, 
    63, 31, 35, 2.1, 31, 11, 3.8, 29, NA)), .Names = c("date", "sales"
    ), class = "data.frame", row.names = c(NA, -25L))
    

    另一组样本数据&o/p:

    df <- structure(list(date = c("14/11", "14/11", "14/11", "14/11", "14/11", 
    "14/11", "14/11", "14/11", "14/11", "14/11", "14/11", "14/11", 
    "14/11", "14/11", "15/11", "15/11", "15/11", "15/11", "15/11", 
    "15/11", "15/11", "15/11", "15/11", "15/11", "15/11"), sales = c(39, 
    3.2, 13, 8.3, 5, 5.6, 79, 35, 24, 8.1, 21, 40, 50, 82, 8.3, 7.2, 
    63, 31, 35, 2.1, 31, 11, 3.8, 29, NA), id = 1:25, name = c("a", 
    "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", 
    "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y")), .Names = c("date", 
    "sales", "id", "name"), row.names = c(NA, -25L), class = "data.frame")
    
        date sales    id  name bottom3_performer
     1 14/11   3.2     2     b              TRUE
     2 14/11   5.0     5     e              TRUE
     3 14/11   5.6     6     f              TRUE
     4 14/11   8.1    10     j             FALSE
     5 14/11   8.3     4     d             FALSE
     6 14/11  13.0     3     c             FALSE
     7 14/11  21.0    11     k             FALSE
    ...
    

    【讨论】:

    • 使用少量数据,这是可行的,但是当我有多个其他列(销售人员的姓名、id # 等)时,它似乎找到了与底部 3 不同的答案。我走了通过并尝试将所有 --- 值删除为 NA 但不确定还能做什么?
    • 无论有无中间行都试过了!
    • 不确定我是否收到后续问题。但我只是在另一组示例数据上尝试了上面的代码(添加了更多列 - idname),它的工作方式与您在帖子中所期望的一样(请参阅更新的答案!)。
    • 看起来列中可能有一些不同的分类,所以会清理并回复您!
    • 对不起,即使清理了数据,现在我得到的只是列中的 FALSE。
    猜你喜欢
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-17
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    相关资源
    最近更新 更多