作者bedroom0204 (khkh)
看板R_Language
标题[问题] 符合条件时,将下一行的资料利用
时间Mon Nov 21 18:54:16 2022
[问题类型]:
程式谘询(我想用R 做某件事情,但是我不知道要怎麽用R 写出来)
[软体熟悉度]:
入门(写过其他程式,只是对语法不熟悉)
[问题叙述]:
我有一组资料,如下图左。
每个Product跟Sku会进行N次测试,但我只想要留都成功的组合。
如Product1 & M,测试了3次,但我只想要留Product1 M 2022/10/25 23:18这笔。
而Product2 & S,最後一笔的Result1 & Result2有NG的状况,
所以我要借用前一个OK的那笔。
最後整理结果如下图右。
我目前的想法不是用group_by,而是从for 回圈去逐row看是否NG,
如果NG再看下一row是否为同一product和sku,
如果是的话,便将下一row的值贴上此row。
但不知道有没有比较好的做法。
https://imgur.com/z7FPje9
===============================================================
简单来说我想要组合同一个product & sku下的结果,
如前所述的product2 & S,11:58的result 3 & 4有OK,所以要保留,
但result 1&2的NG就要取用9:48的结果。
我一开始也想尝试用group_by,
但是group_by(product, sku)後,
我目前仅会列出根据时间的最後一笔(arrange後summarise_all(last)),
而不知道怎麽把group_by後的结果作上述的组合动作。
[环境叙述]:
Windows
R-4.0.3
[关键字]:
dplyr
summarise
row
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 211.23.35.151 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1669028059.A.66F.html
※ 编辑: bedroom0204 (211.23.35.151 台湾), 11/21/2022 18:56:30
1F:推 DavidDX: 有点看不太懂,但是整体来说是不管有几笔资料,只要其中 11/21 21:47
2F:→ DavidDX: 一笔资料的results 1有OK的结果,就是OK。 不知道我这样 11/21 21:47
3F:→ DavidDX: 理解是否对? 11/21 21:47
4F:推 fox1375: 不用group_by有什麽特殊考量吗?回圈应该会比较慢 11/21 22:10
5F:推 Wush978: 因为你的逻辑有顺序问题,建议用SQL的window clause 11/22 08:47
6F:→ Wush978: R我目前不知道有没有window clause的替代品 11/22 08:48
7F:推 lycantrope: 没有顺序问题吧,最终结果不就只是看有OK就取OK. 11/22 09:47
对,没有顺序问题,只要同一个product&sku的result1-4分别有出现过OK,就取OK,
如果该组合没有其他资料,或是过去都NG,就维持最後一笔的结果。
※ 编辑: bedroom0204 (211.23.35.151 台湾), 11/22/2022 14:40:03
8F:→ SonicJuice: 看起来可以拆分两部分作业, 在每组product, sku找出 11/22 18:09
9F:→ SonicJuice: 一个符合你要求的date, 再找出result1-4的适合值, 最 11/22 18:09
10F:→ SonicJuice: 後再merge起来 11/22 18:09
11F:→ SonicJuice: 第一部份, 先把ok/ng转换成1/0,逐row加起来(ok_cnt), 11/22 18:13
12F:→ SonicJuice: 每组product,sku依ok_cnt大至小排序, date早到晚排 11/22 18:13
13F:→ SonicJuice: 序, 再取出每组第一个row, 就会是所求的date 11/22 18:13
14F:→ SonicJuice: 第二部分, 每组product, sku找出max(result1)到max(r 11/22 18:15
15F:→ SonicJuice: esult4) 11/22 18:15
16F:→ SonicJuice: 最後用product,sku作为key去merge两个部分, 应该就是 11/22 18:19
17F:→ SonicJuice: 你要的结果, btw我前面的date排序好像讲反了 11/22 18:19
18F:→ andrew43: 参考 data.table,也一并说明做法了。 11/23 11:02
20F:推 hohiyan: 既然 日期时间(Date) 这个栏位都是采最新的一笔资料 11/25 11:18
21F:→ hohiyan: 那用 排序 + group + long/wide date 应该就可以解决了 11/25 11:20