我有一个简单的问题要弄清楚:
value
1000
2500
5080
10009
Run Code Online (Sandbox Code Playgroud)
我想指定value一个间隔:
value Range
1000 0-1000
2500 1001-5000
5080 5001-10000
10009 10001-20000
Run Code Online (Sandbox Code Playgroud)
我尝试这样:
dt[, Range := ifelse(value < 1001, "0-1000", ifelse(1000 < value < 5001, "1001-5000", ifelse(5000 < value < 10001, "5001-10000", "10001-20000")))
Run Code Online (Sandbox Code Playgroud)
但是,我得到了 Error: unexpected '<' in "dt[, Range := ifelse(value < 1001, "0-1000", ifelse(1000 < value <"
有什么帮助吗?
编辑:
这个问题并不要求将连续变量转换为因子的最佳方法。它要求可复制示例的调试帮助:
library(data.table)
dt <- data.table(value = c(1000, 2500, 5080, 10009))
dt[, Range := ifelse(value < 1001, "0-1000", ifelse(1000 < value < 5001, "1001-5000", ifelse(5000 < value < 10001, "5001-10000", "10001-20000")))
# produces the error above
Run Code Online (Sandbox Code Playgroud)
像许多(某些)错误一样,它表示其含义。与python不同,R无法解释1000 < value < 5001。相反,您需要使用1000 < value & value < 5001
library(data.table)
dt <- data.table(value = c(1000, 2500, 5080, 10009))
dt[, Range := ifelse(value < 1001, "0-1000", ifelse(1000 < value & value < 5001, "1001-5000", ifelse(5000 < value & value < 10001, "5001-10000", "10001-20000")))]
dt
value Range
1: 1000 0-1000
2: 2500 1001-5000
3: 5080 5001-10000
4: 10009 10001-20000
Run Code Online (Sandbox Code Playgroud)
正如@akrun提到的那样,您可能会有一个更好的选择。这是一个例子:
dt[, Range := cut(value, breaks = c(0, 1001, 5001, 10001, 20001), labels = c("0-1000", "1001-5000", "5001-10000", "10001-20000"))]
Run Code Online (Sandbox Code Playgroud)
这将产生一个data.table,它以相同的方式显示,但是提取Range列将为您提供一个与范围相对应的因子。