2013-07-11 2 views
6

저는 R에서 일하고 있으며 숫자 벡터가있는 데이터 프레임 dd_2006이 있습니다. 처음 데이터를 가져 왔을 때 Sum, SumOfCases 및 SumOfUnits 변수 중 3 개에서 $, 소수점 및 일부 공백을 제거해야했습니다. 이를 위해 str_replace_all을 사용했습니다. 그러나 일단 str_replace_all을 사용하면 벡터가 문자로 변환됩니다. 그래서 as.numeric (var)을 사용하여 벡터를 숫자로 변환했지만 NAs가 도입되었습니다 .number 코드를 실행하기 전에 아래 코드를 실행했지만 벡터에 NA가 없었습니다.NA 강제 변환없이 문자를 숫자로 변환

sum(is.na(dd_2006$SumOfCost)) 
[1] 0 
sum(is.na(dd_2006$SumOfCases)) 
[1] 0 
sum(is.na(dd_2006$SumOfUnits)) 
[1] 0 

다음은 벡터에서 $를 제거부터 시작하여 가져 오기 후에서 내 코드입니다. str(dd_2006) 출력에서 ​​공간을 위해 일부 변수가 삭제되었으므로 아래의 코드 str_replace_all의 열 #은 내가 게시 한 출력과 일치하지 않습니다 (원래 코드는 같습니다) :

library("stringr") 
dd_2006$SumOfCost <- str_sub(dd_2006$SumOfCost, 2,) #2=the first # after the $ 

#Removes decimal pt, zero's after, and commas 
dd_2006[ ,9] <- str_replace_all(dd_2006[ ,9], ".00", "") 
dd_2006[,9] <- str_replace_all(dd_2006[,9], ",", "") 

dd_2006[ ,10] <- str_replace_all(dd_2006[ ,10], ".00", "") 
dd_2006[ ,10] <- str_replace_all(dd_2006[,10], ",", "") 

dd_2006[ ,11] <- str_replace_all(dd_2006[ ,11], ".00", "") 
dd_2006[,11] <- str_replace_all(dd_2006[,11], ",", "") 

str(dd_2006) 
'data.frame': 12604 obs. of 14 variables: 
$ CMHSP      : Factor w/ 46 levels "Allegan","AuSable Valley",..: 1 1 1 
$ FY      : Factor w/ 1 level "2006": 1 1 1 1 1 1 1 1 1 1 ... 
$ Population    : Factor w/ 1 level "DD": 1 1 1 1 1 1 1 1 1 1 ... 
$ SumOfCases    : chr "0" "1" "0" "0" ... 
$ SumOfUnits    : chr "0" "365" "0" "0" ... 
$ SumOfCost     : chr "0" "96416" "0" "0" ... 

나는 다음과 같은 코드를 사용하여, here 광산에 비슷한 질문에 대한 응답을 발견

# create dummy data.frame 
d <- data.frame(char = letters[1:5], 
       fake_char = as.character(1:5), 
       fac = factor(1:5), 
       char_fac = factor(letters[1:5]), 
       num = 1:5, stringsAsFactors = FALSE) 

것은 우리가 data.frame 한 눈에 보자를

> d 
    char fake_char fac char_fac num 
1 a   1 1  a 1 
2 b   2 2  b 2 
3 c   3 3  c 3 
4 d   4 4  d 4 
5 e   5 5  e 5 

우리가 실행하자 :

> sapply(d, mode) 
     char fake_char   fac char_fac   num 
"character" "character" "numeric" "numeric" "numeric" 
> sapply(d, class) 
     char fake_char   fac char_fac   num 
"character" "character" "factor" "factor" "integer" 

지금 당신은 아마 자신에게 물어 "어디 변칙입니까?" 글쎄, 나는 R에서 아주 특이한 것들에 부딪 쳤고, 이것은 가장 혼란스러운 것이 아니지만, 혼란 스러울 수 있습니다.

다음과 같습니다. 처음 두 열은 문자입니다. 나는 의도적으로 두 번째 fake_char를 호출했습니다. 이 문자 변수의 유사점을 Dirk이 자신의 답장에서 만든 유사점으로 지정하십시오. 실제로 문자로 변환 된 숫자 벡터입니다. 세 번째와 네 번째 열은 factor이며, 마지막 열은 "순전히"숫자입니다.

변환 함수를 사용하는 경우 fake_char을 숫자 변수로 변환 할 수 있지만 char 변수 자체는 변환 할 수 없습니다.

> transform(d, char = as.numeric(char)) 
    char fake_char fac char_fac num 
1 NA   1 1  a 1 
2 NA   2 2  b 2 
3 NA   3 3  c 3 
4 NA   4 4  d 4 
5 NA   5 5  e 5 
Warning message: 
In eval(expr, envir, enclos) : NAs introduced by coercion 
but if you do same thing on fake_char and char_fac, you'll be lucky, and get away with no NA's: 

은 ( char_fac = as.numeric (char_fac)는 D, fake_char = as.numeric (fake_char))

char fake_char fac char_fac num 
1 a   1 1  1 1 
2 b   2 2  2 2 
3 c   3 3  3 3 
4 d   4 4  4 4 
5 e   5 5  5 5 

그래서 난 내 스크립트에 위의 코드를 시도 변환 , 여전히 NAs (강요에 대한 경고 메시지없이)가 등장했습니다.

#changing sumofcases, cost, and units to numeric 
dd_2006_1 <- transform(dd_2006, SumOfCases = as.numeric(SumOfCases), SumOfUnits = as.numeric(SumOfUnits), SumOfCost = as.numeric(SumOfCost)) 

> sum(is.na(dd_2006_1$SumOfCost)) 
[1] 12 
> sum(is.na(dd_2006_1$SumOfCases)) 
[1] 7 
> sum(is.na(dd_2006_1$SumOfUnits)) 
[1] 11 

나는 또한 등 table(dd_2006$SumOfCases) 내가 관찰에 놓친 모든 문자가 있는지 관찰보고 사용하지만, 어떤이 아니었다했습니다. NAs가 왜 등장하는지, 어떻게 없애겠습니까?

+2

죄송합니다. 무엇이 문제입니까? 링크 된 대답은 모든 것을 아주 잘 요약 한 것으로 보이며 문제의 재현 가능한 예제가 없으면 다른 사람들이 어떻게 도움을 줄지 확신하지 못합니다. – A5C1D2H2I1M1N2O1R2T1

+0

이 데이터가 Excel 또는 다른 스프레드 시트. 다음 번에 내보내기 전에 모든 서식을 지 웁니다. –

답변

10

Anando가 지적했듯이 문제는 데이터의 어딘가에 있으며 재현 할 수있는 예제 없이는 큰 도움이되지 않습니다.

test = as.character(c(1,2,3,4,'M')) 
v = as.numeric(test) # NAs intorduced by coercion 
ix.na = is.na(v) 
which(ix.na) # row index of our problem = 5 
test[ix.na] # shows the problematic record, "M" 

대신의 NA가 도입되고있는 이유에 대한 추측의 문제를 일으키는 레코드를 꺼내 : 말했다, 여기 코드는 당신이 당신에게 문제를 일으키는 데이터의 레코드를 고정하기 위해입니다 NA가 사라질 때까지 직접/개별적으로 처리하십시오.

업데이트 : 문제가 str_replace_all으로 전화를 거는 것 같습니다. 나는 stringr 라이브러리를 모르겠지만, 나는 당신이이 같은 gsub과 같은 일을 수행 할 수 있다고 생각 :이 비록 어떤 작업을 수행하는 완전히 확실하지 않다

v2 = c("1.00","2.00","3.00") 
gsub("\\.00", "", v2) 

[1] "1" "2" "3" 

:

sum(as.numeric(v2)!=as.numeric(gsub("\\.00", "", v2))) # Illustrate that vectors are equivalent. 

[1] 0 

이되지 않는 당신을 위해 몇 가지 특정 목적을 달성, 나는 그것이 필요하지 않는 것처럼 보이고 당신에게 문제를주는 것으로 보인다 전 전처리 에서이 단계를 떨어 뜨 것을 권하고 싶습니다.

+0

SumOfUnits에 해당 코드를 실행할 때'> (ix.na) #row 문제 인덱스 NAs [1] 1098 2297 4728 5559 5592 5702 6955 8191 10517 10881 10955 > test [ix.na] # [ 1] "" "" "" "" "" "" "" "" "" "" ""' 하지만 원래 데이터 집합의 해당 행에서 볼 때, 그것은 다음과 같습니다 'SumOfUnits 800.00 0.00 100.00 100.00 100.00 300.00 400.00 200.00 200.00 600.00 100.00' 그래서 어떻게 프로가 'str_replace_all' 코드를 실행했을 때 데이터 대신 문제가 발생 했습니까? – idemanalyst

+0

문제가 고정 된 것처럼 보입니다. 나는 그 값들을 캐스팅 할 수 있기 때문에 그 문자열들을 사전 처리하는 것이 실제로는 잘 모르겠지만, 업데이트 된 대답에서'gsub'를 사용하는 다른 해결책을 설명합니다. –

+0

그게 다야, 고마워! – idemanalyst

4

문자를 숫자로 변환하려면 먼저 as.factor를 사용하여 factor로 변환하고 기존 변수를 저장/덮어 씁니다. 다음으로이 factor 변수를 숫자로 변환합니다 (as.numeric 사용). 이런 방식으로 NAs를 만들지는 않을 것이고 당신이 가지고있는 데이터 세트를 숫자로 변환 할 수있을 것입니다.

+0

as.numeric (as.factor (df $ x))는 값을 1과 2로 바꿉니다. –

관련 문제