簡體   English   中英

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

[英]using function in lapply in data.table in r

如果有如下樣本數據集。

> 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

我怎么解決這個問題。

為了擴展我的評論,我會做這樣的事情:

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所有列,並使用帶有partial參數的sort.int獲取每列的第二個最小值,這比使用sort稍微有效(因為我們不必對整個數據集進行排序以查找第二個最小值)。

然后我們使用set()以代替那些行,其中該列值小於第二最小值時, 列,其值為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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM