如果在 Mata 中有条件,则替换 x
Replace x if cond in Mata
我想用基于 0/1 向量 cond
的标量 a
覆盖向量 x
的一些元素。在伪代码中:x[cond]=a
.
x[cond]
不是 Mata 中子集化的正确方法。我应该使用 select(x,cond)
。不幸的是,后一个对象无法分配给。
x[selectindex(cond)] = a
失败,因为这样的赋值要求 =
. 两边的维度相同
我可以将后一种方法修改为
x[selectindex(cond)] = J(sum(cond),1,a)
这是马塔语中的成语吗?我期待更直接的东西,因为 Stata 有很好的 replace x = a if cond
语法。
在一般情况下,我认为这与您将获得的效果差不多。如果 cond
是 0
或 1
,sum(cond)
是安全的,但更通用的替代方法是:
select = selectindex(cond)
x[select] = J(length(select), 1, a)
我同意这不是最简单的语法。额外的赋值冒号运算符 :=
在这里会很好。
如果x
和cond
是浏览量,st_store()
是另一种选择:
st_store(., st_viewvars(x), st_viewvars(cond), J(sum(cond), 1, a))
如果您已经知道变量 names/indices 而不必调用 st_viewvars()
,那就更好了。
我想用基于 0/1 向量 cond
的标量 a
覆盖向量 x
的一些元素。在伪代码中:x[cond]=a
.
x[cond]
不是 Mata 中子集化的正确方法。我应该使用select(x,cond)
。不幸的是,后一个对象无法分配给。x[selectindex(cond)] = a
失败,因为这样的赋值要求=
. 两边的维度相同
我可以将后一种方法修改为
x[selectindex(cond)] = J(sum(cond),1,a)
这是马塔语中的成语吗?我期待更直接的东西,因为 Stata 有很好的 replace x = a if cond
语法。
在一般情况下,我认为这与您将获得的效果差不多。如果 cond
是 0
或 1
,sum(cond)
是安全的,但更通用的替代方法是:
select = selectindex(cond)
x[select] = J(length(select), 1, a)
我同意这不是最简单的语法。额外的赋值冒号运算符 :=
在这里会很好。
如果x
和cond
是浏览量,st_store()
是另一种选择:
st_store(., st_viewvars(x), st_viewvars(cond), J(sum(cond), 1, a))
如果您已经知道变量 names/indices 而不必调用 st_viewvars()
,那就更好了。