2016-08-22 1 views
1

MSSQL 데이터베이스에 많은 데이터가 있습니다. 필자는 필자에게 필자가 필요로하는 데이터를 얻기 위해 쿼리를 작성하여 분석하기 위해 해당 데이터를 R에로드하려고합니다.SQL to R 데이터 읽기 데이터 변경

문제점 : 데이터를 R로로드 할 때 CustomerID 번호가 변경되고 있습니다. 즉, SQL 서버의 CustomerID는 "xxxx0101"으로 표시됩니다. [xxxx가있는 CustomerID 필드가 끝에 가까울 때만 변경되었음을 나타냅니다. ]하지만 R에서는 "xxxx2724"로 표시됩니다 (따옴표는 문자열을 나타내지 않습니다. SQL의 데이터 유형은 varchar (30)이고 R은 데이터 유형을 자동 할당하는 것으로 나타남). 또한 내 DataValues에 라운딩 할 것이다 (SQL : 2.84 .... 7366 R : 2.84 ..... 6575)

SQL 테이블 구조 : 같은 정보가로 나타납니다 R에서

CustomerID | DataValue 
xxxxxxx0101 | 2.84...7366 

:

CustomerID | DataValue 
xxxxxxx2724 | 2.84...6575 

그리고 왜 R이 내 필드의 값을 변경하는지 이해할 수 없습니다.

R 코드 :

require(RODBC) 
myScript = paste(gsub("\t", " ", readLines("TestQuery.sql")), collapse = " ") 
myData = data.frame(sqlQuery(myDBConnection, myCode)) 
View(myData) 

페이스트() 및 GSUB는() 함수는 (주 readlines 메쏘드에 추가 된) \의 t처럼 물건을 없애 (탭) 내 여러 줄을 저장할 SQL 쿼리를 하나의 문자열로 변환합니다. 내가 그 문제를 일으키는 생각하지 않는다, 나는 MSSQL 서버에 직접 다시로 myscripf의 결과를 붙여 넣기하고 TestQuery.sql

정확한 같은 결과

나는 RODBC 패키지를 사용하고 있습니다를 반환 것을 확인했습니다 내 R과 SQL을 연결하십시오. 이 문제가없는 최신 패키지가 있으면 올바른 패키지인지 확인해야합니다. 내가 좋아하는 작은 테스트 쿼리 뭔가를 실행 해요 경우

data.frame(sqlQuery(myDBConnection, "select top 10 CustomerID from CustList 
order by CustomerID")) 

난 단지 다른 사람들이 올바른에서 온 CustomerIDs의 일부에 문제가 있습니다.

재미있는 사실 : 동료가 내 SQL 쿼리를 실행하여 SAS 데이터 세트를 만든 다음 SAS에서 데이터 세트로 SAS에 데이터 세트를로드하고 위에서 언급 한 문제가 없었습니다 (그는 SAS 데이터 세트를 읽기 위해 R의 Haven 라이브러리를 사용했습니다.)

업데이트 : 먼저 문자 유형의 빈 데이터 프레임을 초기화하고 stringsAsFactors = FALSE를 사용하여 한 번에 하나씩 각 CustomerID를로드하려고 시도했습니다. 아래 코드 :

foo = sqlQuery(myDBConnection, "select top 10 CustomerID from CustList 
order by CustomerID", stringsAsFactors = FALSE) 
testDF = data.frame(CustomerID = character(), stringsAsFactors = FALSE) 
for(i in 1:10) 

{ 
    testDF[i,1] = foo[i,1] 
} 
View(testDF) 

그러나, CustomerIDs 10의 8 변화에 와서는, 변경 두가 마지막에 한에 의해 변경된다. 나는 그 시리즈의 다음 버전이 이전 버전에서 단 하나 떨어져 있다는 사실과 관련이 있다고 생각합니다. 즉, xxxx100이고 xxxx100이고 xxxx100은 두 번 인쇄됩니다. 참고 : 각 CustomerID는 고유하므로 원래 데이터 세트에서는 발생하지 않고 확인되었습니다.

'foo'에 데이터를 처음로드하는 대신 sqlQuery()를 호출하고 싶지만 sqlQuery 함수에 반복 변수를 배치 할 수 없습니다. 아무도 모른다면, 크게 감사하겠습니다.당신은 단순히 2 개 개의 다른 기록을지고 같은 SQL Server 버전 2016 인 경우

+0

근본적으로 다른 데이터 유형을 사용하는 두 시스템간에 데이터 유형이 다를 수 있습니다. 그러나 나는 R을 임의적으로 바꾸는 것에 대해 들어 본 적이 없으며, 수년 동안 계속 해왔다. 결코 그런 일이 없었다. 매우 특이한 ...'RODBC' 비 네트와 같은 내장 데이터 세트에 대한'RODBC' 질의를 사용하여 재현 가능한 예제를 제공 할 수 있습니까? SQL 데이터의 –

+0

은 고객 '2724'' 2.84 ... 6575'의 데이터 값입니까? 아니면 완전히 다른 것입니까? – Chris

+0

Re : @Chris CustomerID는 x0101 (잘 렸음)이고 값은 2.84 .. (잘 렸습니다). (잘 렸습니다) 7366 –

답변

0

당신이 SQL 서버 자체 R의 기능을 사용할 수 있고,이 변환 오류 당신이 설명하는 시나리오에서

+0

2008 R이 내장되어 있지 않습니다. –

0

를 제공하지 않습니다, 그것은 소리 명시 적으로 데이터를 정렬하거나 필터링하지 않으므로 SQL에서 반환됩니다 (각각 고유 한 CustomerID 값이 있음).

Here is a Stack Overflow discussion on this topic

테스트 SQL 쿼리 :

"select top 10 CustomerID from CustList" 

는 문 BY 명시 적 WHERE 또는 ORDER없이 SQL에서 동일한 "10"기록을 얻을 수 보장 할 수 없습니다.

SQL 쿼리 끝에 ORDER BY 문을 추가하면 매번 반환되는 레코드 순서가 동일하게 유지됩니다.

"select top 10 CustomerID from CustList order by CustomerID" 
+0

위의 코드 샘플에 order by 절을 사용하는 것을 잊어 버렸습니다. 그것은 개정되었습니다. –