在r中的data.table中使用lapply中的函数

时间:2014-12-12 07:11:33

标签: r data.table lapply

如果有如下样本数据集。

> 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

我该如何解决这个问题。

2 个答案:

答案 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