dplyr로 특정 값을 NA로 설정
dplyr (data set = dat, variable = x)를 사용하여 이와 같은 작업을 수행하는 간단한 방법을 찾으려고합니다.
day$x[dat$x<0]=NA
간단해야하지만 이것이 제가 현재 할 수있는 최선의 방법입니다. 더 쉬운 방법이 있습니까?
dat = dat %>% mutate(x=ifelse(x<0,NA,x))
다음 replace
보다 조금 더 빠른 것을 사용할 수 있습니다 ifelse
.
dat <- dat %>% mutate(x = replace(x, x<0, NA))
다음을 replace
사용하여 색인을 제공하여 속도를 더 높일 수 있습니다 which
.
dat <- dat %>% mutate(x = replace(x, which(x<0L), NA))
내 컴퓨터에서 이것은 시간을 1/3로 줄였습니다. 아래를 참조하십시오.
다음은 다른 답변을 약간 비교 한 것입니다.
set.seed(24)
dat <- data.frame(x=rnorm(1e6))
system.time(dat %>% mutate(x = replace(x, x<0, NA)))
User System elapsed
0.03 0.00 0.03
system.time(dat %>% mutate(x=ifelse(x<0,NA,x)))
User System elapsed
0.30 0.00 0.29
system.time(setDT(dat)[x<0,x:=NA])
User System elapsed
0.01 0.00 0.02
system.time(dat$x[dat$x<0] <- NA)
User System elapsed
0.03 0.00 0.03
system.time(dat %>% mutate(x = "is.na<-"(x, x < 0)))
User System elapsed
0.05 0.00 0.05
system.time(dat %>% mutate(x = NA ^ (x < 0) * x))
User System elapsed
0.01 0.00 0.02
system.time(dat %>% mutate(x = replace(x, which(x<0), NA)))
User System elapsed
0.01 0.00 0.01
(저는 dplyr_0.3.0.2 및 data.table_1.9.4를 사용하고 있습니다)
특히 data.table-vs-dplyr 토론 과정에서 항상 벤치마킹에 관심이 많기 때문에 microbenchmark와 akrun의 데이터를 사용하여 3 개의 답변에 대한 또 다른 벤치 마크를 제공합니다. dplyr1
내 답변의 업데이트 버전으로 수정 했습니다.
set.seed(285)
dat1 <- dat <- data.frame(x=sample(-5:5, 1e8, replace=TRUE), y=rnorm(1e8))
dtbl1 <- function() {setDT(dat)[x<0,x:=NA]}
dplr1 <- function() {dat1 %>% mutate(x = replace(x, which(x<0L), NA))}
dplr2 <- function() {dat1 %>% mutate(x = NA ^ (x < 0) * x)}
microbenchmark(dtbl1(), dplr1(), dplr2(), unit='relative', times=20L)
#Unit: relative
# expr min lq median uq max neval
# dtbl1() 1.091208 4.319863 4.194086 4.162326 4.252482 20
# dplr1() 1.000000 1.000000 1.000000 1.000000 1.000000 20
# dplr2() 6.251354 5.529948 5.344294 5.311595 5.190192 20
다음 is.na<-
기능을 사용할 수 있습니다 .
dat %>% mutate(x = "is.na<-"(x, x < 0))
또는 수학 연산자를 사용할 수 있습니다.
dat %>% mutate(x = NA ^ (x < 0) * x)
을 사용하는 경우 data.table
아래 코드가 더 빠릅니다.
library(data.table)
setDT(dat)[x<0,x:=NA]
벤치 마크
data.table_1.9.5
및 사용dplyr_0.3.0.9000
library(microbenchmark)
set.seed(285)
dat <- data.frame(x=sample(-5:5, 1e7, replace=TRUE), y=rnorm(1e7))
dtbl1 <- function() {as.data.table(dat)[x<0,x:=NA]}
dplr1 <- function() {dat %>% mutate(x = replace(x, x<0, NA))}
microbenchmark(dtbl1(), dplr1(), unit='relative', times=20L)
#Unit: relative
#expr min lq mean median uq max neval cld
#dtbl1() 1.00000 1.000000 1.000000 1.000000 1.000000 1.000000 20 a
#dplr1() 2.06654 2.064405 1.927762 1.795962 1.881821 1.885655 20 b
업데이트 된 벤치 마크
사용 data.table_1.9.5
하고 dplyr_0.4.0
. 나는 약간 더 큰 데이터 세트를 사용하여 교체 as.data.table
와 함께 setDT
(물론 포함 @Sven 호헨 슈타인의 빠른 기능.)
set.seed(285)
dat <- data.frame(x=sample(-5:5, 1e8, replace=TRUE), y=rnorm(1e8))
dat1 <- copy(dat)
dtbl1 <- function() {setDT(dat)[x<0,x:=NA]}
dplr1 <- function() {dat1 %>% mutate(x = replace(x, x<0, NA))}
dplr2 <- function() {dat1 %>% mutate(x = NA ^ (x < 0) * x)}
microbenchmark(dtbl1(), dplr1(), dplr2(), unit='relative', times=20L)
#Unit: relative
# expr min lq mean median uq max neval cld
#dtbl1() 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 20 a
#dplr1() 2.523945 2.542412 2.536255 2.579379 2.518336 2.486757 20 b
#dplr2() 1.139216 1.089992 1.088753 1.058653 1.093906 1.100690 20 a
업데이트 된 벤치 마크 2
@docendo discimus의 요청에 따라 다시 자신의 "새로운"버전 벤치 마크 dplyr
사용 data.table_1.9.5
과 dplyr_0.4.0
.
NOTE: Because there is a change in @docendo discimus code, I changed 0
to 0L
for the data.table`
set.seed(285)
dat <- data.frame(x=sample(-5:5, 1e8, replace=TRUE), y=rnorm(1e8))
dat1 <- copy(dat)
dtbl1 <- function() {setDT(dat)[x<0L, x:= NA]}
dplr1 <- function() {dat1 %>% mutate(x = replace(x, which(x<0L), NA))}
dplr2 <- function() {dat1 %>% mutate(x = NA ^ (x < 0) * x)}
microbenchmark(dtbl1(), dplr1(), dplr2(), unit='relative', times=20L)
#Unit: relative
#expr min lq mean median uq max neval cld
#dtbl1() 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000 20 a
#dplr1() 2.186055 2.183432 2.142293 2.222458 2.194450 1.442444 20 b
#dplr2() 2.919854 2.925795 2.852528 2.942700 2.954657 1.904249 20 c
data
set.seed(24)
dat <- data.frame(x=sample(-5:5, 25, replace=TRUE), y=rnorm(25))
The most natural approach in dplyr is to use the na_if
function.
For one variable:
dat %<>% mutate(x = na_if(x, x < 0))
For all variables:
dat %<>% mutate_all(~ na_if(., . < 0))
If interested in replacing a specific value, instead of a range for all variables:
dat %<>% mutate_all(na_if, 0)
Note that I am using the %<>%
operator from the magrittr
package.
ReferenceURL : https://stackoverflow.com/questions/27909000/set-certain-values-to-na-with-dplyr
'program tip' 카테고리의 다른 글
처음 2를 선택하는 방법 (0) | 2021.01.11 |
---|---|
스팸을 피하기 위해 웹 사이트에 이메일 주소를 표시하는 방법은 무엇입니까? (0) | 2021.01.11 |
`Object`는 JavaScript의 함수입니까? (0) | 2021.01.11 |
DataContractSerializer에 의해 생성 된 XML 서식 (0) | 2021.01.11 |
C # 분산 문제 : 목록 할당 (0) | 2021.01.10 |