2017-12-15 4 views
1

값 목록이 값 범위 내에 있는지 확인한 다음 특정 값을 할당해야하는지 확인해야합니다. ifelse() 문을 중첩하지 않고이 작업을 수행 할 방법을 찾고 싶습니다. ifelse은 51 회 이상 중첩 할 수 없으며 끔찍해 보입니다.).숫자를 여러 비교 연산자 및 값과 비교하십시오.

인위적인 사례이므로 일반화 할 수있는 방법이 있는지 궁금합니다 (예 : 루프? * 적용)? 나는 paste(eval())과 관련이 있다고 생각하고 있지만 제대로 작동하지 않습니다. 미리 감사드립니다.

set.seed(2222) 
comparison_table = data.frame(
    lower_comp = c('>=', '>=', '>='), 
    upper_comp = c('<', '<', '<'), 
    lower_value = c(3, 33, 100), 
    upper_value = c(31, 40, 120), 
    new_value = c(1, 2, 3) 
) 

df = data.frame(
    value = runif(n = 25, min = 1, max = 130) 
) 

df$new_value = with(df, 
    ifelse(value >= 3 & value < 33, 1, 
    ifelse(value >= 33 & value < 100, 2, 
    ifelse(value >= 100 & value < 120, 3, NA)))) 

value   new_value 
48.427905  NA 
24.461992  1 
107.576807  3 
76.461703  NA 
124.694209  NA 
14.132063  1 
98.638509  NA 
32.436195  NA 
88.470441  NA 
9.095131   1 
49.548878  NA 
85.647608  NA 
75.357280  NA 
120.696858  NA 
113.347924  3 
51.364939  NA 
126.896975  NA 
128.282762  NA 
115.333414  3 
75.022578  NA 
128.170932  NA 
2.200451   NA 
24.085131  1 
99.672971  NA 
24.945700  1 
+2

lower_comp 및 upper_comp 열이 항상 동일한 값을 사용하면 'library (data.table); setDT (df); df [comparison_table, on =. (값> = lower_value, 값 Frank

답변

3

당신은 당신의 가치 벡터를 분할 cut()을 사용할 수 있습니다 : (어떤 외부 NA로 설정됩니다)

df$new_value <- cut(df$value, breaks= c(3,33,100,120),labels=FALSE, right = FALSE) 

이 세 가지 간격을 정의

[3,33) 
[33,100) 
[100,120) 

사용 right = FALSE로 만들려면 왼쪽 포함 : 기본값은 (x, y]이며 [x, y)이 필요합니다.

+0

도움에 감사드립니다. 이건 확실히 내가 쓴 사건에 효과가있어. 나는 엉망이되어서 간격이 '주문 됨'이라는 것이 내가 질문을 업데이트했다는 것을 깨닫지 못했다. 나는 내가 필요로하는 조건으로 문자열을'붙여 넣기 (paste) '할 수있는 솔루션을 고안하려고 노력해왔다. data.frame을 사용하여 문자열을 평가했다.'df $ new_value [parse (eval (text = paste0 ('value > = 3 '))] = 1' 코드 콤팩트의 부분에 ..... – bringtheheat

+0

@bringtheheat 그 경우'cut()'주위에 약간의 래퍼 함수를 ​​써서 입력 불평등을'grepl (" > = ", comparison_table $ lower_comp)'라고하고,'TRUE'이면'right <- FALSE', 그렇지 않으면'right <- TRUE'라고 말하고, 다음과 같이 break ('unique (c (comparison_table $ lower_value, comparison_table $ 이 값은 불평등이 균일 할 때만 유효합니다. 즉, "> =와 <" or "> 및 <="을 따르고 있습니다. – Mako212

+0

@bringtheheat 실제로는 비교 테이블의 형식을 지정하지 않습니다. 네가 가진 것처럼, 난 그냥 휴식을위한 하나, 그리고 왼쪽 또는 오른쪽 손의 간격 여부를 정의하는 두 개의 열이있을거야. – Mako212