如何使用data.table基于两列差值的相对大小创建新的二分类列
解决方案
你可以直接利用data.table的按引用赋值特性实现需求,不需要额外调用ifelse/case_when,执行效率更高,和你现有代码的衔接逻辑也一致:
方法1:排序后直接赋值(最直观,符合你现有逻辑)
library(data.table) set.seed(123) table <- data.table(value1 = runif(10), value2 = runif(10)) x <- 5 # 生成差值列 table[, difference := value1 - value2] # 先初始化新列为0 table[, new_binary := 0] # 按差值降序排序,取前x行赋值为1 table[order(-difference)[1:x], new_binary := 1]
方法2:用秩函数单行实现
如果希望代码更简洁,可以用data.table内置的frank函数实现,支持自定义并列值的处理规则:
# ties.method可调整并列值的处理逻辑:可选"first"(先出现的优先)、"random"(随机)、"min"(所有并列值都计入)等 table[, new_binary := as.integer(frank(-difference, ties.method = "first") <= x)]
结果验证
输出最终表可以看到符合预期:
print(table) # value1 value2 difference new_binary # 1: 0.28757752 0.95683335 -0.6692558 0 # 2: 0.78830514 0.45333416 0.3349710 1 # 3: 0.40897692 0.67757064 -0.2685937 0 # 4: 0.88301740 0.57263340 0.3103840 1 # 5: 0.94046728 0.10292468 0.8375426 1 # 6: 0.04555650 0.89982497 -0.8542685 0 # 7: 0.52810549 0.24608773 0.2820178 1 # 8: 0.89241904 0.04205953 0.8503595 1 # 9: 0.55143501 0.32792072 0.2235143 0 # 10: 0.45661474 0.95450365 -0.4978889 0
可以看到刚好差值最大的5行被标记为1,其余为0。
内容的提问来源于stack exchange,提问作者rw2
相关产品推荐
相关产品推荐

