2017-10-11 3 views
0

파일에 몇 가지 텍스트와 데이터 프레임을 쓰는 가장 좋은 방법은 무엇입니까? 텍스트는 변수를 문자열에 붙여 넣어 만들어집니다.r 파일에 텍스트 및 데이터 프레임 쓰기

예 원하는 출력 :

library(data.table) 

mydf <- data.frame(ID = 1:10, val1 = 1:10*2, val2 = 1:10*3) 

fwrite(x = mydf, 
    file = "path/file.txt", 
    sep = ",", 
    col.names=T) 

하지만이 : 나는 파일에 dataframe를 작성할 수

myvar <- "Hello World" 
out_string <- paste0("Here is some text.\n", 
        "This line has a variable: ", myvar, "\n", 
        "Data frame below the line\n", 
        "=================\n") 
cat(out_string) 

그리고 : 나는 초기 텍스트 문자열을 만들 수 있습니다

Here is some text. 
This line has a variable: Hello World 
Data frame below the line 
================= 
ID,val1,val2 
1,2,3 
2,4,6 
3,6,9 
4,8,12 
5,10,15 
6,12,18 
7,14,21 
8,16,24 
9,18,27 
10,20,30 

이 두 가지를 결합하는 것이 최선의 방법인지 모르겠습니다.

데이터 프레임을 out_string 끝에 붙여 넣은 다음 파일에 쓰는 것이 가장 좋지만 내 시도가 실패했다고 생각합니다.

cat(paste0(out_string, mydf, collapse='')) 
# Here is some text. 
# This line has a variable: Hello World 
# Data frame below the line 
# ================= 
# 1:10Here is some text. 
# This line has a variable: Hello World 
# Data frame below the line 
# ================= 
# c(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)Here is some text. 
# This line has a variable: Hello World 
# Data frame below the line 
# ================= 
# c(3, 6, 9, 12, 15, 18, 21, 24, 27, 30) 

답변

1

아마 이렇게 할 수있는 방법이 몇 가지 있습니다. , fwrite

cat(out_string, file = '/tmp/test.txt') 
cat(paste0(colnames(mydf), collapse = ','), file = '/tmp/test.txt', append = T, sep = '\n') 
cat(apply(mydf,1,paste0, collapse=','), file = '/tmp/test.txt', append = T, sep = '\n') 

물론

사용 간단한 일입니다 :

cat(out_string, file = '/tmp/test.txt') 
fwrite(x = mydf, 
    file = "/tmp/test.txt", 
    sep = ",", 
    col.names=T, 
    append=T) 
+0

두 가지 방법 모두 요청에 따라 작동합니다. 고맙습니다! – conor

1

하나의 옵션입니다 둘 다 writeLineswrite.csv으로 쓸 수있는 연결을 만들기 위해 :

myvar <- "Hello World" 
out_string <- paste0("Here is some text.\n", 
        "This line has a variable: ", myvar, "\n", 
        "Data frame below the line\n", 
        "=================\n") 
mydf <- data.frame(ID = 1:10, val1 = 1:10*2, val2 = 1:10*3) 


my_file <- file('file.csv', 'w') 

writeLines(out_string, my_file, sep = '') 
write.csv(mydf, my_file, quote = FALSE, row.names = FALSE) 

close(my_file) 

readLines('file.csv') 
#> [1] "Here is some text."     
#> [2] "This line has a variable: Hello World" 
#> [3] "Data frame below the line"    
#> [4] "================="      
#> [5] "ID,val1,val2"       
#> [6] "1,2,3"         
#> [7] "2,4,6"         
#> [8] "3,6,9"         
#> [9] "4,8,12"        
#> [10] "5,10,15"        
#> [11] "6,12,18"        
#> [12] "7,14,21"        
#> [13] "8,16,24"        
#> [14] "9,18,27"        
#> [15] "10,20,30" 
+0

이 메소드는'out_string'과'mydf' 쓰기 사이에 한 줄을 추가하고 컬럼 이름을 인용 부호로 묶어 출력합니다. – conor

+0

@conor'writeLines' ('out_string'은 이미 가지고 있습니다)에 의해 삽입 된 구분자를 제거하고'quote = FALSE' 매개 변수를'write.csv'에 추가하도록 업데이트했습니다. 나는 더 나은 기본값으로'readr :: write_csv'를 사용하는 경향이 있지만,베이스 R에 모든 것을 유지하는 것이 좋다. – alistaire

+0

감사합니다. @alistaire, 지금 요청한 것이 맞습니다. – conor

1

또 다른 방법 : sink()은 파일에 대한 연결을 엽니 다.

sink("<your_new_file_name>") 
out_string 
df 
sink() 
+0

올바르게 렌더링하려면'cat (out_string)'이 있어야합니다. 게다가 요청에 따라 거의 작동하지만'mydf '의 출력에는 csv가 아닌 공백으로 정렬 된 열이 있습니다. 사람이 그 서식을 원한다면 여전히 좋습니다. – conor

+0

죄송합니다. 귀하의 답변 형식에 대한 세부 사항에 대해서는 신경을 쓰지 않았습니다. 두 출력을 결합한 파일을 쓰는 방법을 묻는 줄 알았는데. – shea

+0

걱정할 필요가 없습니다. 나는 '싱크대 (sink)'에 대해 잘 알지 못했고 매우 유용하다는 것을 알 수 있었기 때문에 귀하의 답변에 감사드립니다. – conor

관련 문제