2017-12-21 13 views
3

텍스트 열 중 하나에 쉼표가있는 쉼표로 구분 된 데이터 파일을로드하려고합니다. 다음 샘플 코드는 내 문제를 설명하기 위해 read.csv()을 사용하여로드 할 파일 'test.csv',을 생성합니다. 때문에 Smith, John에서 ','read.csv()로 쉼표로 구분 된 문자열 읽기

> d <- data.frame(name = c("John Smith", "Smith, John"), age = c(34, 34)) 
> d 
     name age 
1 John Smith 34 
2 Smith, John 34 
> write.csv(d, file = "test.csv", quote = F, row.names = F) 
> d2 <- read.csv("test.csv") 
> d2 
      name age 
John Smith 34 NA 
Smith  John 34 

d2 올바르게 할당되지 않는다. d2이 정확히 d처럼 보이도록 파일을 읽으려면 어떻게해야합니까?

감사합니다.

+1

문제는'quote = F'로 파일을 작성한 것입니다. 그냥 가져 가면 효과가 있습니다. – G5W

+0

고마워,하지만 내 문제는 파일이있는 그대로 나에게 보낸 것입니다. 이러한 샘플 코드를 사용하여 이러한 파일을 만들었습니다. – Manojit

+1

@Manojit 데이터의 일부에 쉼표가 있기 때문에 파일의 CSV 항목을 _escape_해야합니다. 따옴표가 없다면,'read.csv'는 두 번째 줄에 'Smith, John, 34'을 표시합니다. 즉, _three_ columns를 볼 수 있습니다. –

답변

5

1) read.patternread.pattern (gsubfn 패키지) 등의 파일을 읽을 수

library(gsubfn) 

pat <- "(.*),(.*)" 
read.pattern("test.csv", pattern = pat, header = TRUE, as.is = TRUE) 

주는 : 다른 가능성을 판독한다

  name age 
1 John Smith 34 
2 Smith, John 34 

2) 개의 패스 다시 고쳐서 다시 읽으십시오. 이것은 패키지를 사용하지 않고 동일한 출력을 제공합니다.

L <- readLines("test.csv") 
read.table(text = sub("(.*),", "\\1|", L), header = TRUE, sep = "|", as.is = TRUE) 

주 : 비 공백이있는 최종 용도의 세번째 필드 3 개 필드 (2) 가정이 (1)

pat <- "(.*),([^,]+),([^,]+)" 

같은 상황 사용이 대 당신은 어떤이있는 경우

text = gsub("(\\S),(\\S)", "\\1|\\2", L) 

: 텍스트 필드 및 필드 2 자 이상을 가질 수있는 쉼표 옆에있는 마지막 두 쉼표 적어도 하나 개의 공간이 각에 인접한 다른 배열은 (1)의 정규 표현식을 적절하게 수정하고 (2)의 sub 또는 gsub을 수정하면됩니다.

+0

고마워요! 이렇게하면'test.csv.'의 문제가 해결됩니다. 내 실제 파일에는 텍스트 열 앞에 다른 숫자 열이 있습니다. 어떻게 그 파일에 대해 'read.table()'구문을 적용해야합니까? – Manojit

+0

답글 끝에 메모를 메모로 이동했습니다. –

+0

감사합니다! "pat <-"([^,] +), (. *), (. *) "는"숫자 ","텍스트 ","숫자 "순으로 열이있는 파일에서 작동합니다. 이 파일로 당신의 방법 # 2를 어떻게 사용합니까? – Manojit