如果有如下样本数据集。
> tmp <- data.table(x=c(1:10),y=(5:14))
> tmp
x y
1: 1 5
2: 2 6
3: 3 7
4: 4 8
5: 5 9
6: 6 10
7: 7 11
8: 8 12
9: 9 13
10: 10 14
我想选择两个最小的数字,我希望将0值更改为其他数字。
像
x y
1: 1 5
2: 2 6
3: 0 0
4: 0 0
5: 0 0
6: 0 0
7: 0 0
8: 0 0
9: 0 0
10: 0 0
我认为编码是
tmp[, c("x","y"):=lapply(.SD, x[which(!x %in% sort(x)[1:2])] = 0}), .SDcols=c("x","y")]
但它会全部改变0
我该如何解决这个问题。
答案 0 :(得分:4)
为了扩展我的评论,我会做这样的事情:
for (j in names(tmp)) {
col = tmp[[j]]
min_2 = sort.int(unique(col), partial=2L)[2L] # 2nd lowest value
set(tmp, i = which(col > min_2), j = j, value = 0L)
}
这将循环遍历tmp
中的所有列,并使用带有sort.int
参数的partial
获取每列的第二个最小值,这比使用{{1}略高一些(因为我们不必对整个数据集进行排序以找到第二个最小值)。
然后我们使用sort
替换列值大于第二个最小值的行,那个列,值为0.
答案 1 :(得分:0)
可能你可以试试
tmp[, lapply(.SD, function(x) replace(x,
!rank(x, ties.method='first') %in% 1:2, 0))]
# x y
#1: 1 5
#2: 2 6
#3: 0 0
#4: 0 0
#5: 0 0
#6: 0 0
#7: 0 0
#8: 0 0
#9: 0 0
#10:0 0