【发布时间】:2017-11-22 09:14:57
【问题描述】:
鉴于这些数据,前 4 列(rowid、order、line、special),我需要创建一个列,numSpecial 如下:
rowid order line special numSpecial
1 A 01 X 1
2 B 01 0
3 B 02 X 2
4 B 03 X 2
5 C 01 X 1
6 C 02 0
其中 numSpecial 是通过对每个特殊订单(值 = X)的次数求和来确定的,假设 order-line 本身是特殊的,否则为 0。
我首先尝试添加一个简单地将“order”与“X”连接起来的列,称之为orderX,看起来像:
orderX
AX
BX
BX
BX
CX
CX
然后在orderx中做order & special的求和:
df$numSpecial <- sum(paste(order, special, sep = "") %in% orderx)
但这不起作用,它返回每个订单的所有行的结果总和:
numSpecial
4
4
4
4
4
4
然后我尝试了 as.data.table,但我没有得到预期的结果:
as.data.table(mydf)[, numSpecial := sum(paste(order, special, sep = "") %in% orderx), by = rowid]
但是每行只返回 1 而不是总和:
numSpecial
1
0
1
1
1
0
我在哪里做错了?我不认为我不应该创建该 orderX 列,但我无法弄清楚如何正确计算。它类似于excel中的countif,很容易做到。
【问题讨论】:
-
库(dplyr); df %>% group_by(order) %>% mutate(numSpecial = ifelse(special=="X", sum(special=="X"), 0))`
-
另一个是有道理的,但是当我尝试这个时,我得到了上面 2 次尝试的组合,即 numSpecial 结果为 [4,0,4,4,4,0]。跨度>
标签: r sum data.table