2016-11-12 2 views
1

같은 행의 다른 열의 값을 기준으로 열의 일부 값을 다시 코딩하는 일부 레거시 R 코드를 상속했습니다. 당신이 결과를 검사하는 경우R : 실수로 요소 열을 사용하여 데이터 프레임의 서브 세트를 논리로 설정했습니다.

df <- data.frame(value = c(1, 2, 3, 4, 5, 6), 
       reversed = c("true", "false", 
           "true", "true", 
           "false", "false")) 

str(df) 
#> 'data.frame': 6 obs. of 2 variables: 
#> $ value : num 1 2 3 4 5 6 
#> $ reversed: Factor w/ 2 levels "false","true": 2 1 2 2 1 1 

df$recoded_value <- df$value 
df$recoded_value[df$reversed] <- 7 - df$recoded_value[df$reversed] 

, 이것은 의도하지 않은 결과를 : 그 실수로, 현실에서, 그 값과 같이 (문자열로 변환되는) 요소, 실제로이었다 부울 값으로 생각되었다. df[2, "recoded_value"]은 5이지만 그 의도는 2입니다. 또한 df[3, "recoded_value"]은 3이지만 의도는 4입니다.

여기에 무슨 일이 일어나고 있는지 알고 싶습니다. 첫 번째 가설은 R이 하나의 요인 수준을 TRUE으로, 다른 하나를 FALSE으로 처리한다는 것입니다.

df[c(1,3), ] 
#> value reversed recoded_value 
#> 1  1  true    6 
#> 3  3  true    3 

df[c(2,5), ] 
#> value reversed recoded_value 
#> 2  2 false    5 
#> 5  5 false    5 

은 무슨 일 것입니다 : 동일한 요소의 수준이 은 동일하게 취급되지 않기 때문에 그러나 이것은 분명히 사실이 아니다?

명확히하기 : 나는이 문제에 대한 해결책에 관심이 없다. 의도 한 결과를 내기 위해 코드를 수정하는 방법을 알고 있습니다. 이해하고 싶습니다.

  1. 왜이 코드가 작동합니까? 요인 컬럼에 기초하여 어떻게 부분 집합을 할 수 있습니까? 무엇이 `[`도 이것을 허용하고 있습니까?
  2. 동일한 값 (, 즉, 같은 수준의 요소)이 다른 방식으로 처리되는 이유는 무엇입니까? 이 이후에 언급 된 바와 같이

답변

1

reversedfactor 아닌 logical 벡터이다.

df$reversed 
#[1] true false true true false false 
#Levels: false true 

levels

는 알파벳 순서대로, R에서 TRUE/FALSE 값은 논리적, 그래서 우리는 (영업의 코드에서) 예기치 않은 출력을 이유에 대해서는 logical 벡터

df$reversed <- df$reversed=="true" 

로 변환 및 factor의 저장 모드는 integer

as.integer(df$reversed) 
#[1] 2 1 2 2 1 1 
입니다 617,451,515,

그래서 우리는 출력의 첫 번째 값이 'recoded_value'및 상기 제 1의 제 관찰은 즉이 숫자 인덱스

df$recoded_value[df$reversed] 
#[1] 2 1 2 2 1 1 

에 기초하여 부분적인 것이라고는 '반전'사용 'recoded_value'서브 세트 때 관찰 등등, 우리가 올바른 논리적 인덱스를 사용하는 대신 경우

df$recoded_value[df$reversed=="true"] 
#[1] 1 3 4 

은의이 변경 '반전'이 함께 동작하는 방법을 확인합시다

df$reversed <- df$reversed=="true" 
df$recoded_value[df$reversed] <- 7 - df$recoded_value[df$reversed] 
df[c(1,3), ] 
# value reversed recoded_value 
#1  1  TRUE    6 
#3  3  TRUE    4 
df[c(2,5),] 
# value reversed recoded_value 
#2  2 FALSE    2 
#5  5 FALSE    5 
+1

답변 주셔서 감사합니다! 왜 내가 전에 이것을 깨닫지 못했는지 모르겠다. 나는 최소한의 예제를 만들 때 빈약 한 숫자를 선택했다. 행 번호와 동일한 값을 선택해서는 안됩니다. ': -p' 어쨌든, 고마워. +1 –