Jeśli istnieje przykładowy zestaw danych, jak poniżej.przy użyciu funkcji lapply w data.table w 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
Chcę wybrać dwie najniższe liczby i chcę zmienić wartość 0 na inne numery.
jak
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
myślę, że kodowanie jest
tmp[, c("x","y"):=lapply(.SD, x[which(!x %in% sort(x)[1:2])] = 0}), .SDcols=c("x","y")]
ale zmienia wszystko 0
Jak mogę rozwiązać ten problem.
Co jeśli liczby nie są wyjątkowe? To znaczy. załóżmy, że masz '> 2' 1s w pierwszej kolumnie, w takim przypadku, czy chcesz uzyskać' pierwszy' dwa 1s? – akrun
IIUC chciałbyś zamienić wszystkie oprócz dwóch najniższych wartości dla * każdej kolumny * na 0. Zrobiłbym to z pętlą for przez kolumny i używając 'sort.int' wraz z argumentem' partial' by znaleźć nth najmniejsza dla każdej kolumny i zastępująca wszystkie pozostałe wiersze wartością 0 dla tej kolumny. Ale możemy to zrobić bardziej efektywnie, stosując algorytmy czasu liniowego, aby znaleźć n-ty maksimum (które jest [FR # 919] (http://github.com/Rdatatable/data.table/issues/919), jeszcze do zrobienia). – Arun