R语言data.table使用rowSums取子集时保留原始行号的问题咨询
你之前的写法出错是因为新增的row列为字符类型,在执行dt>=5的比较时,R会自动将数值5强转为字符串类型,所有row列的值("row1"、"row2"、"row3")按字典序和字符串"5"比较时结果均为TRUE,导致每一行的判断结果都为真。
解决方案1:指定参与数值比较的列
仅选择需要判断的数值列传入rowSums,排除行标识列:
dt <- data.table(a=c(1,2,3),b=c(4,5,6),row=c('row1','row2','row3')) # 显式指定a、b列参与比较 dt[rowSums(dt[, .(a,b)] >=5) > 0]
解决方案2:自动筛选数值列参与计算
如果数值列较多,可通过.SDcols参数自动选择所有数值列,不用手动罗列:
# is.numeric会自动筛选所有数值类型的列参与计算 dt[rowSums(dt[, .SD, .SDcols = is.numeric] >=5) > 0]
解决方案3:筛选后再生成行标识
如果不需要提前保留行标识,也可以在筛选完成后再添加,避免标识列干扰数值比较逻辑:
dt <- data.table(a=c(1,2,3),b=c(4,5,6)) # 先筛选,再通过.I生成原始行标识 result <- dt[rowSums(dt >=5) > 0][, row := paste0("row", .I)]
以上三种方法运行后都可以得到你需要的结果:
a b row 1: 2 5 row2 2: 3 6 row3
内容的提问来源于stack exchange,提问作者moth
相关产品推荐
相关产品推荐

