我有以下数据框架:
using DataFrames
df = DataFrame(
condition = [false, false, true, false, false, false, true, false, false, false],
time = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
输出:
10×2 DataFrame
Row │ condition time
│ Bool Int64
─────┼──────────────────
1 │ false 1
2 │ false 2
3 │ true 3
4 │ false 4
5 │ false 5
6 │ false 6
7 │ true 7
8 │ false 8
9 │ false 9
10 │ false 10
我想计算相对于条件值(真/假)的行差。这意味着对于第一行,最接近的为真值距离是2行。条件行为true的值应该为0。下面是期望的输出:
10×3 DataFrame
Row │ condition time diff
│ Bool Int64 Int64
─────┼─────────────────────────
1 │ false 1 2
2 │ false 2 1
3 │ true 3 0
4 │ false 4 1
5 │ false 5 2
6 │ false 6 1
7 │ true 7 0
8 │ false 8 1
9 │ false 9 2
10 │ false 10 3
所以我想知道是否有人知道如何计算行与最接近的条件值在数据框朱莉娅的差异?
transform(df, :condition =>
(w->((f,u)->min.(f(u),reverse(f(reverse(u)))))(
v->accumulate(
(x,y)->ifelse(y,0,x+1),
v;init=length(v)
),
w
)) => :diff)
(u
,v
,w
)为向量。x
、y
为bool/int类型。f
是一个函数)
执行输出:
10×3 DataFrame
Row │ condition time diff
│ Bool Int64 Int64
─────┼─────────────────────────
1 │ false 1 2
2 │ false 2 1
3 │ true 3 0
4 │ false 4 1
5 │ false 5 2
6 │ false 6 1
7 │ true 7 0
8 │ false 8 1
9 │ false 9 2
10 │ false 10 3
在我的REPL中,它是一行,如下所示,但试图使其更易于阅读:
transform(df, :condition => (v->((f, v)->min.(f(v),reverse(f(reverse(v)))))(v->accumulate((x, y)->ifelse(y, 0, x+1), v; init=length(v)), v)) => :diff)
这不是最清晰的方式,也不是最有效的方式,但它是一段简短的代码。为了得到更清晰、更有效的结果,应该定义一个单独的函数。
最后,该列必须有一个true
值,否则结果没有意义(这可以通过更多代码轻松检查,但不确定OP在这种情况下想要什么)。