write.table은 행 이름이있을 때 원하지 않는 선행 빈 열을 헤더에 씁니다.


91

이 예를 확인하십시오.

> a = matrix(1:9, nrow = 3, ncol = 3, dimnames = list(LETTERS[1:3], LETTERS[1:3]))
> a
  A B C
A 1 4 7
B 2 5 8
C 3 6 9

테이블이 올바르게 표시됩니다. 파일에 쓰는 방법에는 두 가지가 있습니다.

write.csv(a, 'a.csv') 예상대로 제공됩니다.

"","A","B","C"
"A",1,4,7
"B",2,5,8
"C",3,6,9

그리고 write.table(a, 'a.txt')어떤 나사

"A" "B" "C"
"A" 1 4 7
"B" 2 5 8
"C" 3 6 9

실제로, 빈 탭이 없습니다 .... 다운 스트림에 대한 엉덩이에 고통입니다. 버그입니까, 기능입니까? 해결 방법이 있습니까? (이외 write.table(cbind(rownames(a), a), 'a.txt', row.names=FALSE)

건배, 야닉

답변:


140

인용 ?write.table, 섹션 CSV 파일 :

기본적으로 행 이름 열에는 열 이름이 없습니다. 만약 col.names = NArow.names = TRUE빈 열 이름은 스프레드 시트에서 읽을 수있는 CSV 파일에 사용되는 규칙 인 추가됩니다.

그래서 당신은해야합니다

write.table(a, 'a.txt', col.names=NA)

그리고 당신은

"" "A" "B" "C"
"A" 1 4 7
"B" 2 5 8
"C" 3 6 9

4
@Marek, rownames 열에 이름을 추가 할 수 있습니까? 즉, ""대신 "ID"또는 유사 항목을 추가 하시겠습니까?
Dnaiel 2013

2
@Dnaiel 나는 당신이 할 수 없다는 것을 알고 있습니다. 행 이름을 데이터와 바인딩하고 이름을 지정할 수 있습니다 (문제에서와 같이).
Marek

1
@rusalkaguy 당신의 편집은 의미가 없습니다. 이 "확장자"는 원래 질문에 있습니다 ( "다른 해결 방법")
Marek

열 이름 아래에 정렬 할 각 열의 번호를 어떻게 얻습니까?
rrs

@rrs 고정 너비 형식을 의미합니까? gdata 패키지의 write.fwf를 살펴보십시오 . 그리고 코멘트 대신 새로운 질문을하십시오. 왜 그게 필요한가요?!
Marek

10

@Marek에 대한 약간의 수정은 매우 유용한 답변으로 rownames 열에 헤더를 추가합니다. 임시로 rownames를 data.frame의 첫 번째 열로 추가하고 실제 행 이름을 무시하고 작성합니다.

> a = matrix(1:9, nrow = 3, ncol = 3, dimnames = list(LETTERS[1:3], LETTERS[1:3]))
> write.table(data.frame("H"=rownames(a),a),"a.txt", row.names=FALSE)

그리고 당신은

"H" "A" "B" "C"
"A" 1 4 7
"B" 2 5 8
"C" 3 6 9

이것을 포함하도록 Marek의 대답을 편집해야한다고 생각합니다.
user8397947

3

tidyverse (dplyr 등) 에서 작업하는 모든 사람 rownames_to_column()을 위해 tibble 패키지 의 함수를 사용하여 row.names를 열로 쉽게 변환 할 수 있습니다. 예 :

library('tibble')
a = as.data.frame(matrix(1:9, nrow=3, ncol=3, 
                  dimnames=list(LETTERS[1:3], LETTERS[1:3])))

a %>% rownames_to_column('my_id')

  my_id A B C
1     A 1 4 7
2     B 2 5 8
3     C 3 6 9

row.names=FALSE옵션 을의 옵션 과 결합하면 write.table()모든 열에 대한 헤더 이름이 출력됩니다.


1

행렬을 저장할 때 동일한 문제가 발생 write.table()하고 row.names 열을 유지하려는 사람들을 위해 실제로 매우 간단한 솔루션이 있습니다.

 write.table(matrix,file="file.csv",quote=F,sep=";", row.names=T
             col.names=c("row_name_col;val1_col","val2_col"))

그렇게함으로써 기본적으로 write.table함수를 속여서 row.names 열에 대한 헤더 레이블을 생성하게됩니다. 결과 .csv 파일은 다음과 같습니다.

row_name_col;val1_col;val2_col
row1;1;4 
row2;2;5 
row3;3;6 

col.names = c ( "row_name", colnames (matrix)) 시도 중이며 잘못된 'col.names'사양이라는 오류가 발생합니다. 무엇이 잘못되었는지 아십니까? c ( "row_name", colnames (matrix))는 올바른 텍스트를 제공합니다.
MichaelE

write.table길이의 헤더를 예상하고 ncol(matrix)하나 더 제공합니다. 위의 솔루션을 시도했지만 작동하지 않습니다. 가장 좋은 방법은 다른 솔루션에서와 같이 행 이름을 열로 이동하는 것입니다
aurelien

0

연결을 사용하여 유연성을 추가하는 @mnel의 간단한 기능을 수정했습니다. 기능은 다음과 같습니다.

my.write <- function(x, file, header, f = write.csv, ...){
# create and open the file connection
datafile <- file(file, open = 'wt')
# close on exit 
on.exit(close(datafile))
# if a header is defined, write it to the file (@CarlWitthoft's suggestion)
if(!missing(header)) {
writeLines(header,con=datafile, sep='\t')
writeLines('', con=datafile, sep='\n')
}
# write the file using the defined function and required addition arguments  
f(x, datafile,...)
}

함수를 'write.table', 'write.csv', 'write.delim'등으로 지정할 수 있습니다.

건배!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.