将值分配给特定范围

时间:2018-04-03 07:34:59

标签: r data.table

我有一个简单的问题要弄明白:

value
1000
2500
5080
10009

我想将value指定为间隔:

value    Range
1000     0-1000
2500     1001-5000
5080     5001-10000
10009    10001-20000

我试试这个:

dt[, Range := ifelse(value < 1001, "0-1000", ifelse(1000 < value < 5001, "1001-5000", ifelse(5000 < value < 10001, "5001-10000", "10001-20000")))

但是,我得到了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

1 个答案:

答案 0 :(得分:3)

与许多(某些)错误一样,它意味着它所说的内容。与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

正如@akrun所提到的,你可能会因为一个因素而变得更好。这是一个例子:

dt[, Range := cut(value, breaks = c(0, 1001, 5001, 10001, 20001), labels = c("0-1000", "1001-5000", "5001-10000", "10001-20000"))]

这会生成一个以相同方式显示的data.table,但是提取Range列将为您提供与范围对应的因子。