[英]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.