R data.table字符型列降序排名报一元运算符参数无效错误如何解决
报错原因
你遇到的报错有两个诱因:
- 代码里引用了不存在的
date列,你的日期列实际名为week_no - 如你推测,
week_no是字符类型,无法直接使用一元负号运算符-做取反操作
解决方案
方法1:直接使用frankv自带的order参数(最推荐)
data.table的frankv原生支持通过order参数控制排序方向,不需要对输入值做取反操作,直接适配字符型排序逻辑:
df[, dummy := frankv(week_no, order = -1L), by = group_id]
运行后结果符合降序排名要求:
group_id week_no dummy 1: 1 2019-01 2 2: 1 2019-02 1 3: 2 2019-03 2 4: 2 2019-04 1
如果是多列排序,也可以给order传入和排序列等长的正负1向量,分别控制每列的排序方向。
方法2:将字符年月转为日期类型后取反
如果后续也需要对week_no做日期相关运算,可以先转为日期格式(或zoo包的yearmon类),之后就可以用负号做降序排名:
# 转成Date类型,补上月的第一天做拼接 df[, dummy := frankv(-as.Date(paste0(week_no, "-01"))), by = group_id]
该方法输出结果和方法1完全一致。
内容的提问来源于stack exchange,提问作者Sweepy Dodo
相关产品推荐
相关产品推荐

