示例数据:
dt = data.table(a=c(10,20,30,40),b=c(40,30,20,10),c=c(0,0,1,1))
rank_a = dt[,rank(a)]
rank_a
[1] 1 2 3 4
这会返回我想要的内容。但是,如果我添加一个 by 语句,
rank_a = dt[,rank(a),by=c]
...然后它返回整个数据框,包括按列“c”,而不仅仅是我想要的答案。
如何解决此问题?
最佳答案
删除一个或多个“by”列的通用解决方案可能是使用 mget
+ 链接:
dt = data.table(a=c(10,20,30,40),b=c(40,30,20,10),c=c(0,0,1,1),d=c(0,0,0,1))
dt
# a b c d
# 1: 10 40 0 0
# 2: 20 30 0 0
# 3: 30 20 1 0
# 4: 40 10 1 1
by.cols = c("c", "d")
# group by one or multiple columns without returning the "group by" columns
# (includes code of @Frank now, see comment)
dt[, .(rank=rank(a)),by = by.cols] [, -(1:length(by.cols))]
# rank
# 1: 1
# 2: 2
# 3: 1
# 4: 1
#
# OLD code (before including the code snippets from @Frank)
# dt[, .(rank = rank(a)),by=mget(by.cols)] [, -(1:length(by.cols))]
不漂亮,但工作。
PS:是否有更好的方法从 data.table
中排除其名称存储在字符向量中的列?
关于r - 不要使用 data.table 自动返回按列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50239111/