2014-10-05 2 views
0

두 개의 열 (A와 B)이있는 데이터 구조가 있습니다. 열 A는 범주 B는 숫자입니다 (0.0에서 1.0까지). 나는 B 열의 값이 0.5보다 크거나 같을 때 값이 1 인 열 C를 만들고 B 열의 값이 0.5보다 작 으면 0을 생성하려고합니다. 이 작업을 수행하는 방법에 대한 제안 사항은 무엇입니까? 마지막 DF는 다음과 같아야합니다0과 1 벡터로 데이터 프레임 채우기

A = c('spA', 'spB', 'spC', 'spD') 
B = c(0.25, 0.15, 0.50, 0.75) 
C = c(0,0,1,1) 
df = data.frame(A, B, C) 
+0

가'ifelse'을 방지하기 위해'ifelse' – jbaums

+2

시도를 살펴 보자. –

+0

또는 더 빠른'df $ C <- as.numeric (df $ B> = 0.5)' – Rentrop

답변

1

그냥 사용

A = c('spA', 'spB', 'spC', 'spD') 
B = c(0.25, 0.15, 0.50, 0.75) 
df = data.frame(A, B) 

df$C <- as.numeric(df$B >= 0.5) 

@ 데이비드 Arenburg : 3 개 솔루션의 속도 비교는 지적 우리의 위
이 훨씬 왜 내가 아는 그나마 정직하게 빠릅니다.

require(microbenchmark) 
microbenchmark(
    df$C <- ifelse(df$B>=0.5, 1, 0), 
    transform(df, C = as.numeric(B >= 0.5)), 
    df$C <- as.numeric(df$B>=0.5) 
) 

결과 :

Unit: microseconds 
            expr  min  lq median  uq max neval 
     df$C <- ifelse(df$B >= 0.5, 1, 0) 33.585 35.7580 38.1285 41.6845 140.66 100 
transform(df, C = as.numeric(B >= 0.5)) 143.821 149.7470 155.0815 164.5640 284.48 100 
     df$C <- as.numeric(df$B >= 0.5) 20.546 22.9165 24.2995 27.2630 53.34 100 

편집 : 맥주 데이터 집합

df <- data.frame(B=runif(100000)) 

require(microbenchmark) 
microbenchmark(
    df$C <- ifelse(df$B>=0.5, 1, 0), 
    transform(df, C = as.numeric(B >= 0.5)), 
    df$C <- as.numeric(df$B>=0.5) 
) 

Unit: microseconds 
            expr  min  lq  median   uq  max neval 
     df$C <- ifelse(df$B >= 0.5, 1, 0) 31620.826 33623.452 34529.8380 55652.9290 62707.064 100 
transform(df, C = as.numeric(B >= 0.5)) 811.561 979.286 1032.6255 1248.5550 2333.137 100 
     df$C <- as.numeric(df$B >= 0.5) 606.498 764.542 808.0045 979.0875 23805.112 100 
+0

4 행 데이터 벤치 마크에서 벤치 마크를 했는가? –

+0

나는 둘 다했다. 단지 100000 개의 행을 가진 데이터 세트에 대한 결과를 추가했습니다. 결과가 같습니다. 작고 큰 데이터 세트로'$'는 변환보다 빠릅니다. quantile이 겹치지 않는 것은 주목할 만하다. 따라서 상당히 빠릅니다 ... – Rentrop

+0

실제로'$'의 분산은 거대하며 최대 값은 10 배만큼 높기 때문에 실제로 더 빠릅니다. 당신은 더 나은 중앙값을 얻을 수 있습니다. –

관련 문제