2017-09-05 1 views
2

희망이 맞습니다. 숫자 열 값이있는 데이터 프레임이 있고이 열을 사용하여 숫자 값이 해당 값을 기반으로 다른 버킷에 '매핑'된 새 열을 만들고 싶습니다. 아래는 몇 가지 테스트 데이터뿐 아니라이 문제를 해결하기 위해 현재 사용하고있는 ifelse() 방식의 중첩 된 중첩 방식입니다. 나는이 방법은 많은 버킷 잘 확장되지 않기 때문에,) (ifelse 문을 중첩 포함하지 않는 좋은 방법이 코딩 바라고 : 여기 여기 수치를 범위가 다른 범위에 따라 R의 범주 형 값에 매핑하십시오.

mydf = data.frame(strings = letters[1:10], 
       numerics = c(0.2, 0.4, 1.3, 5.2, 3.3, 2.1, 7.3, 1.1, 4.3, 8.3), 
       stringsAsFactors = FALSE) 

내 테스트 dataframe, 그리고 내

  • 모든 값을 <이 이동 0
  • 에 : 내 문제 해결에 중첩 된 ifelse() 접근 방법 : 다음과 같이 위의 코드가 무엇을

    mydf$buckets = ifelse(mydf$numerics <= 2, 0, 
            ifelse(mydf$numerics <= 4, 1, 
             ifelse(mydf$numerics <= 5, 2, 
              ifelse(mydf$numerics <= 7, 3, 4)))) 
    

    은 숫자 열에서지도 값입니다

  • 모든 값 < 4 이동 1
  • 모든 값 < 5 이동 2
  • 모든 값 < 7 이동 3
  • 모든 값> = 7은이 방법을 "케이 4

갈 적은 양의 버켓 이상으로 잘 확장됩니다. 이 모든 도움을 주시면 감사하겠습니다! 감사합니다,

+3

'cut (mydf $ numerics, breaks = c (0, 2, 4, 5, 7, 10), labels = c (0, 1, 2, 3, 4))' –

+1

당신이 관심을 가질 것이라고 생각합니다. 'dplyr' 꾸러미에서'case_when '. 비늘이 잘 잡히고 코드가 명확합니다. – tictocchoc

+1

베이스 R에서 '잘라 내기'는이 경우에 맞게 특별히 설계되었습니다. 비 모노톤 매핑의 경우 룩업 테이블을 만들고 병합 할 수 있습니다. – MichaelChirico

답변

3

정말 이미 의견 @tictocchoc에서 언급 한 바와 같이 상황이 일종의 case_when를 사용하여 같은 :

suppressPackageStartupMessages(library(tidyverse)) 

mydf = data.frame(strings = letters[1:10], 
        numerics = c(0.2, 0.4, 1.3, 5.2, 3.3, 2.1, 7.3, 1.1, 4.3, 8.3), 
        stringsAsFactors = FALSE) 

mydf %>% 
    mutate(buckets = case_when(
    numerics < 2 ~0, 
    numerics < 4 ~1, 
    numerics < 5 ~2,  
    numerics < 7 ~3, 
    numerics >= 7 ~4 
)) 
#> strings numerics buckets 
#> 1  a  0.2  0 
#> 2  b  0.4  0 
#> 3  c  1.3  0 
#> 4  d  5.2  3 
#> 5  e  3.3  1 
#> 6  f  2.1  1 
#> 7  g  7.3  4 
#> 8  h  1.1  0 
#> 9  i  4.3  2 
#> 10  j  8.3  4 
+0

) 나는이 솔루션을 좋아한다. 나는 기본 R 솔루션이 그러나 조금 더 간단하지만 이것은 좋은 해결책이기도합니다. – Canovice

3

기본 R에 findInterval 기능을 사용해보십시오 :

findInterval(mydf$numerics,c(2,4,5,7)) 
    [1] 0 0 0 3 1 1 4 0 2 4 
+0

이것은 cut()보다 더 정확한 사용법을 가지고있다. ( – Canovice

관련 문제