【问题标题】:prevent condition has length > 1 with := operator in data.table in R防止条件长度> 1,R中data.table中的:=运算符
【发布时间】:2026-02-19 10:50:02
【问题描述】:

我像这样创建一个data.table

dd<-data.table(c(7,8,9),c(10,5,10),c(8,9,11))

然后我尝试使用 := 向它传递一个函数,但我得到条件长度 > 1 错误。

dd[,Cat:= as.factor(if(V1 > V2 & V2 > V3) 
{"decrease,decrease"} else if(V1 > V2 & V2 < V3)
{"decrease,increase"} else if(V1 < V2 & V2 < V3)
{"increase,increase"} else if(V1 < V2 & V2 > V3)
{"increase,decrease"})]

我知道这是因为if 是这样工作的。如果我只有两列,我可以执行以下操作:

dd[, Cat:= as.factor(ifelse(V1>V2, "increase", "decrease"))]

这很有效,因为 ifelse 显然是矢量化的。但我想产生三种不同的输出,而不是两种。

【问题讨论】:

  • 您也可以改为处理子集。例如,dd[V1 &gt; V2 &amp; V2 &gt; V3, Cat := {"decrease,decrease"}] 以避免 if 语句/嵌套在一起。

标签: r data.table


【解决方案1】:

你可以嵌套ifelse

ifelse(V1 > V2 & V2 > V3, "decrease,decrease",
    ifelse(V1 > V2 & V2 < V3, "decrease,increase",
        ifelse(...)))

但在这种情况下,我可能会使用paste(ifelse(V1 &lt; V2, "increase", "decrease"), ifelse(V2 &lt; V3, "increase", "decrease"), sep = ","),所以我不必写出每个组合。

另见Alternatives to nested ifelsenested ifelse statement in R

【讨论】: