Mam ramkę danych i chciałbym binaryzować każdy punkt danych w pierwszych 56 kolumnach pod warunkiem, że jeśli wartość jest większa niż 0, to zostaje ustawiona do 1, w przeciwnym razie jest ustawiony na 0. Czy istnieje prosty sposób na zrobienie tego?Potrzebuję "binaryzacji" niektórych danych w ramce danych w R
Odpowiedz
Używanie wektorowy ifelse
można zrobić:
m[,1:56] <- ifelse(m[,1:56] > 0,1,0)
Na przykład, możemy przetestować w małej matrycy:
m <- matrix(sample(c(-2,2),5*3,rep=T),ncol=5,nrow=3,byrow=T)
> m
[,1] [,2] [,3] [,4] [,5]
[1,] 2 2 2 2 -2
[2,] 2 2 -2 2 -2
[3,] 2 2 2 2 2
> m[,2:5] <- ifelse(m[,2:5] > 0,1,0)
> m
[,1] [,2] [,3] [,4] [,5]
[1,] 2 1 1 1 0
[2,] 2 1 0 1 0
[3,] 2 1 1 1 1
Moje myśli dokładnie! (Musiałem więc zamieścić inną alternatywę.) – A5C1D2H2I1M1N2O1R2T1
@AnandaMahto, niesamowity !! –
@RicardoSaporta, Właściwie wolę 'ifelse', na wypadek gdybyś nie potrzebował tylko wyników binarnych. – A5C1D2H2I1M1N2O1R2T1
Można skorzystać z faktu, że TRUE
i FALSE
równoznaczny "1" i "0" oraz:
set.seed(1)
mydf <- data.frame(matrix(rnorm(100), nrow = 10))
mydf[, 1:5] <- (mydf[, 1:5] > 0) + 0
mydf
# X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
# 1 0 1 1 1 0 0.3981059 2.40161776 0.475509529 -0.5686687 -0.5425200
# 2 1 1 1 0 0 -0.6120264 -0.03924000 -0.709946431 -0.1351786 1.2078678
# 3 0 0 1 1 1 0.3411197 0.68973936 0.610726353 1.1780870 1.1604026
# 4 1 0 0 0 1 -1.1293631 0.02800216 -0.934097632 -1.5235668 0.7002136
# 5 1 1 1 0 0 1.4330237 -0.74327321 -1.253633400 0.5939462 1.5868335
# 6 0 0 0 0 0 1.9803999 0.18879230 0.291446236 0.3329504 0.5584864
# 7 1 0 0 0 1 -0.3672215 -1.80495863 -0.443291873 1.0630998 -1.2765922
# 8 1 1 0 0 1 -1.0441346 1.46555486 0.001105352 -0.3041839 -0.5732654
# 9 1 1 0 1 0 0.5697196 0.15325334 0.074341324 0.3700188 -1.2246126
# 10 0 1 1 1 1 -0.1350546 2.17261167 -0.589520946 0.2670988 -0.4734006
Idea +0
polega jedynie na wymuszeniu wartości logicznych TRUE
i na ich odpowiednikach numerycznych. Jeśli pracujesz nad kolumnami w macierzy i użyłeś, musisz przekonwertować wynikowy wektor na macierz. Jednak w tym przypadku działa to doskonale (jak zauważył @Dason).
mydf[, 1:5] <- as.numeric(mydf[, 1:5] > 0)
Czy próbowałeś użyć tutaj 'as.numeric'? Działa to dobrze w zastępstwie dla mnie ... Jeśli nie robimy wymiany, różnica jest ważna, ale na coś takiego działa dobrze. – Dason
@Dason, dobry połów! (Nie, nie próbowałem - po prostu założyłem, że dostałbym błąd dotyczący wierszy nie tej samej długości). Dobry stary recykling, przypuszczam. Zaktualizuję. Dzięki. – A5C1D2H2I1M1N2O1R2T1
Podejście za pomocą pmin
i pmax
. (Naprawdę nie zalecane)
pmin(pmax(m[,2:5], 0),1)
ale pozwala się, aby dodać trochę Benchmarking
ag <- function() ifelse(m[,2:5] > 0,1,0)
mn <- function()pmin(pmax(m[,2:5], 0),1)
am <- function() (m[, 2:5] > 0) + 0
am2 <- function() as.numeric((m[, 2:5] > 0))
library(microbenchmark)
microbenchmark(ag(),mn(), am(), am2())
## Unit: microseconds
## expr min lq median uq max neval
## ag() 19.888 20.712 21.9375 22.6430 39.548 100
## mn() 50.135 51.172 52.2530 53.1055 113.854 100
## am() 3.076 3.406 4.1755 4.6030 7.912 100
## am2() 2.623 2.989 3.4640 4.0135 6.995 100
@ rozwiązań AnandaMahto są te jasne zwycięzców, z podejściem as.numeric
jeszcze szybciej!
Dodaj opcję 'as.numeric' w mojej ostatnio zaktualizowanej odpowiedzi (podziękowania dla Dasona za wykonanie mojej pracy domowej). Zgodnie z wcześniejszym doświadczeniem powinno to być jeszcze szybsze. – A5C1D2H2I1M1N2O1R2T1
@AnandaMahto - gotowe. i tak. – mnel
- 1. iteracyjnego niektórych kolumn w ramce danych
- 2. Wypełnianie wartości w ramce danych w R?
- 3. suma zmiennych w ramce danych R
- 4. Identyfikowanie duplikatów kolumn w ramce danych R
- 5. Liczba wystąpień niektórych słów w ramce danych pandy
- 6. Wklej razem każdą parę kolumn w ramce danych w R?
- 7. Zastąp zawartość kolumny współczynnika w ramce danych R
- 8. Szybkie zastępowanie wartości w ramce danych w R
- 9. Sprawdzanie identycznych kolumn w ramce danych w R
- 10. Jak dodać kolumnę w ramce danych w R
- 11. Jak pokolorować określone komórki w ramce danych/tabeli w R?
- 12. Jak zamienić wartość w ramce danych w R?
- 13. zmianę kolejności poziomów współczynników w ramce danych
- 14. Zamień ciąg w ramce danych
- 15. Upuszczanie kolumn w ramce danych
- 16. kolumny Data w ramce danych
- 17. Zastępowanie NA za pomocą zer w ramce danych R
- 18. Zastosuj funkcję do każdej wartości w ramce danych R
- 19. R jak mogę obliczyć różnicę między rzędami w ramce danych
- 20. Zmuszanie kolumnę list na sznurkiem w ramce danych R
- 21. Losowy wybór wierszy w ramce danych Pandy
- 22. Powtarzanie listy danych Data.frames w pojedynczej ramce danych
- 23. Wybieranie wierszy w wielowierszowej ramce danych
- 24. Tworzenie zmiennej w ramce danych R w zależności od innej ramki danych
- 25. Zastąp wartości w ramce danych na podstawie innej ramki danych w R
- 26. Filtrowanie danych w R
- 27. Jak określić brakującą wartość w ramce danych
- 28. sortowanie danych w R
- 29. interpolację danych w R
- 30. R - scalić listę ramek danych w jednej ramce danych z brakujących wartości przez rząd
Możesz również zobaczyć [to pytanie] (http://stackoverflow.com/q/14526429/1270695) i różne odpowiedzi, a także niektóre testy porównawcze, jeśli chodzi o szybkość. Różnica z tym pytaniem polega na tym, że pracujesz tylko nad podzestawem kolumn. – A5C1D2H2I1M1N2O1R2T1
Czy jest jakiś szczególny powód, dla którego wartości powinny wynosić 0/1 zamiast TRUE/FALSE? Możesz uciec, pozostawiając wynik tak logiczny, jak na kilka rzeczy. – Dason