2016-09-19 7 views
2

STATAから出力されたと思われる.txtファイルがありますが、わかりません。.txtテーブルをRに読み込む方法

  Q1 |  Freq.  Percent  Cum. 
------------+----------------------------------- 
    answer |   35  21.08  21.08 
     text |   4  2.41  23.49 
     words |   35  21.08  44.5 
    something |   38  22.89  67.47 
     blah |   54  32.53  100.00 
------------+----------------------------------- 
     Total |  166  100.00 

       Q2 |  Freq.  Percent  Cum. 
------------------+----------------------------------- 
       foo |   1  0.60  0.60 
     blahblah |   11  6.63  7.23 
       etc |   26  15.66  22.89 
     more text |   82  49.40  72.29 
      answer |   7  4.22  76.51 
    survey response |   39  23.49  100.00 
------------------+----------------------------------- 
      Total |  166  100.00 

     Q3 |  Freq.  Percent  Cum. 
------------+----------------------------------- 
    option |   7  4.22  4.22 
     text |   24  14.46  18.67 
     blahb |   25  15.06  33.73 
    more text |   82  49.40  83.13 
     etc |   28  16.87  100.00 
------------+----------------------------------- 
     Total |  166  100.00 

これは、約200の質問とそれぞれのアンケート回答で続きます。誰もが各調査の質問をRの別々のデータフレームにすばやく読み込む方法を知っていますか?

+0

あなたが見てみることができ'スキャン'少しカウントして、多分 'grep'を少し使って、おそらく再利用可能なコードを作ることができます。 – lmo

答えて

3

scan()は必要ないが:

txt <- "   Q1 |  Freq.  Percent  Cum. 
------------+----------------------------------- 
answer |   35  21.08  21.08 
text |   4  2.41  23.49 
words |   35  21.08  44.5 
something |   38  22.89  67.47 
blah |   54  32.53  100.00 
------------+----------------------------------- 
Total |  166  100.00 

Q2 |  Freq.  Percent  Cum. 
------------------+----------------------------------- 
foo |   1  0.60  0.60 
blahblah |   11  6.63  7.23 
etc |   26  15.66  22.89 
more text |   82  49.40  72.29 
answer |   7  4.22  76.51 
survey response |   39  23.49  100.00 
------------------+----------------------------------- 
Total |  166  100.00 

Q3 |  Freq.  Percent  Cum. 
------------+----------------------------------- 
option |   7  4.22  4.22 
text |   24  14.46  18.67 
blahb |   25  15.06  33.73 
more text |   82  49.40  83.13 
etc |   28  16.87  100.00 
------------+----------------------------------- 
Total |  166  100.00" 


library(purrr) 

あなたは同じように簡単に上記のテキストベクトル対ファイルから読み込むことができます。ここでの主な目標は、データからクラフトを取り除き、それを作業できる形式にすることです。したがって、破線とTotal行を取り除き、スペースをコンマに変換します。これはあなたのデータフォーマットについて大きな前提となりますので、一貫している必要があります。

readLines(textConnection(txt)) %>% 
    discard(~grepl("(----|Total)", .)) %>% 
    gsub("[[:space:]]*\\|[[:space:]]*", ",", .) %>% 
    gsub("[[:space:]][[:space:]]+", ",", .) %>% 
    gsub("^,", "", .) -> lines 

テーブル間に空白行があります。これはコードが作る別の前提です。その空白行を見つけ、空白の間の行(テキストの開始と終了を含む)を抽出します。次に、それをread.csvというデータフレームに読み込みます。

starts <- c(1, which(lines=="")+1) 
ends <- c(which(lines=="")-1, length(lines)) 

map2(starts, ends, function(start, end) { 
    read.csv(textConnection(lines[start:end]), stringsAsFactors=FALSE) 
}) 

これは、データフレームのリストに結果:

## [[1]] 
##   Q1 Freq. Percent Cum. 
## 1 answer 35 21.08 21.08 
## 2  text  4 2.41 23.49 
## 3  words 35 21.08 44.50 
## 4 something 38 22.89 67.47 
## 5  blah 54 32.53 100.00 
## 
## [[2]] 
##    Q2 Freq. Percent Cum. 
## 1    foo  1 0.60 0.60 
## 2  blahblah 11 6.63 7.23 
## 3    etc 26 15.66 22.89 
## 4  more text 82 49.40 72.29 
## 5   answer  7 4.22 76.51 
## 6 survey response 39 23.49 100.00 
## 
## [[3]] 
##   Q3 Freq. Percent Cum. 
## 1 option  7 4.22 4.22 
## 2  text 24 14.46 18.67 
## 3  blahb 25 15.06 33.73 
## 4 more text 82 49.40 83.13 
## 5  etc 28 16.87 100.00 

しかし、私はこれは一つの大きなデータフレームとしてより有用かもしれないと思う:

map2_df(starts, ends, function(start, end) { 

    df <- read.csv(textConnection(lines[start:end]), stringsAsFactors=FALSE) 

    colnames(df) %>% 
    tolower() %>% 
    gsub("\\.", "", .) -> cols 

    question <- cols[1] 
    cols[1] <- "text" 

    setNames(df, cols) %>% 
    mutate(question=question) %>% 
    mutate(n=1:nrow(.)) %>% 
    select(question, n, text, freq, percent, cum) %>% 
    mutate(percent=percent/100, cum=cum/100) 

}) 
## question n   text freq percent cum 
## 1  q1 1   answer 35 0.2108 0.2108 
## 2  q1 2   text 4 0.0241 0.2349 
## 3  q1 3   words 35 0.2108 0.4450 
## 4  q1 4  something 38 0.2289 0.6747 
## 5  q1 5   blah 54 0.3253 1.0000 
## 6  q2 1    foo 1 0.0060 0.0060 
## 7  q2 2  blahblah 11 0.0663 0.0723 
## 8  q2 3    etc 26 0.1566 0.2289 
## 9  q2 4  more text 82 0.4940 0.7229 
## 10  q2 5   answer 7 0.0422 0.7651 
## 11  q2 6 survey response 39 0.2349 1.0000 
## 12  q3 1   option 7 0.0422 0.0422 
## 13  q3 2   text 24 0.1446 0.1867 
## 14  q3 3   blahb 25 0.1506 0.3373 
## 15  q3 4  more text 82 0.4940 0.8313 
## 16  q3 5    etc 28 0.1687 1.0000 
+0

ありがとうございました! – Lee88

関連する問題