0

私は、データのテキスト分析を提供するために取り組んできました。多くの場合、分析には、紙に書き起こしをコーディングし、その情報を数値コードとして R にインポートすることが含まれていました。上記の単語番号を特定の行幅 (任意の 80 文字を使用しましょう) にカットした単語の書き起こしを出力したいと考えています。

最小限の視覚化の例:

#what we start with:

   person   text word.num
1    greg    The        1
2    greg    dog        2
3    greg   went        3
4    greg     to        4
5    greg    the        5
6    greg   zoo,        6
7    greg    but        7
8    greg    ate        8
9    greg first.        9
10  sally     He       10
11  sally  likes       11
12  sally  water       12
13  sally      a       13
14  sally    bit       14
15  sally   too.       15

#欲しいもの:

1   2   3    4  5   6
The dog went to the zoo, 

7   8   9      10 11     
but ate first. He likes   

12    13  14  15
water a   bit too.  

単語数が大きくなると短い単語を超える可能性があり、単語の前に追加のスペースを配置する必要があるという追加の問題が発生します。これは、最大数の最大文字数 (桁数) を決定し、この量よりも少ない単語の後に十分なスペースを追加することで、貼り付けプロセスで簡単に実行できると思います。

これまでのところ、これに取り組むために私の考えは次のとおりでした。

  1. 各行が特定の最大長である文字ベクトルの 1 列の行列を作成します (strwrapここで役立つ場合があります)。
  2. 上記で説明したように、短い単語の後に余分なスペースを追加します (ここnchargsub役立つ場合があります)。
  3. 単語カウント関数を使用して付随する行列の数値を決定し、数値cumsum(seq実際には文字) の付随する行列を作成します。これも 1 列です。これは、行ごとに文字 (単語) マトリックスと一致します。
  4. ここで、2 つの行列を行ごとに交互にする必要があります (これを行う方法がわからない)
  5. 単語の上の数字を揃えます(これを行う方法はわかりませんが、ncharここで役立つかもしれません)

私はこれを基本ツールに保持したいと思いますが、HadelystringRが役立つと確信していますが、この依存関係を避けたいと考えています。

dput上記のデータ:

 dat <- structure(list(person = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,                           
     1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("greg", "sally"), class = "factor"),             
         text = structure(c(10L, 5L, 14L, 11L, 9L, 15L, 4L, 2L, 6L,                               
         7L, 8L, 13L, 1L, 3L, 12L), .Label = c("a", "ate", "bit",                                 
         "but", "dog", "first.", "He", "likes", "the", "The", "to",                               
         "too.", "water", "went", "zoo,"), class = "factor"), word.num = 1:15), row.names = c(NA, 
     -15L), .Names = c("person", "text", "word.num"), class = "data.frame")  

将来のSOユーザーが検索可能でありながら、その考えを捉えたと感じたタイトルを考案できませんでした. 編集を提案してください...

4

3 に答える 3

3
> datmat <- matrix(c(1:length(dat$text), as.character(dat$text) ), nrow=2, byrow=TRUE)
> datmat
     [,1]  [,2]  [,3]   [,4] [,5]  [,6]   [,7]  [,8]  [,9]     [,10] [,11]   [,12]   [,13] [,14] [,15] 
[1,] "1"   "2"   "3"    "4"  "5"   "6"    "7"   "8"   "9"      "10"  "11"    "12"    "13"  "14"  "15"  
[2,] "The" "dog" "went" "to" "the" "zoo," "but" "ate" "first." "He"  "likes" "water" "a"   "bit" "too."
> options(width=30)
> datmat
     [,1]  [,2]  [,3]   [,4]
[1,] "1"   "2"   "3"    "4" 
[2,] "The" "dog" "went" "to"
     [,5]  [,6]   [,7]  [,8] 
[1,] "5"   "6"    "7"   "8"  
[2,] "the" "zoo," "but" "ate"
     [,9]     [,10] [,11]  
[1,] "9"      "10"  "11"   
[2,] "first." "He"  "likes"
     [,12]   [,13] [,14]
[1,] "12"    "13"  "14" 
[2,] "water" "a"   "bit"
     [,15] 
[1,] "15"  
[2,] "too."

テーブルクラスのオブジェクトに強制し、print.table を使用することで、引用符を削除できます。

> class(datmat) <- "table"
> datmat
     [,1] [,2] [,3] [,4] [,5]
[1,] 1    2    3    4    5   
[2,] The  dog  went to   the 
     [,6] [,7] [,8] [,9]  
[1,] 6    7    8    9     
[2,] zoo, but  ate  first.
     [,10] [,11] [,12] [,13]
[1,] 10    11    12    13   
[2,] He    likes water a    
     [,14] [,15]
[1,] 14    15   
[2,] bit   too. 

また、これで何かできるかもしれません。Gavin が言及した左揃えの問題を修正します。

> gsub("\\[.*\\,.*\\]", "", capture.output( print(datmat, quote=FALSE) ) )
 [1] "     "                    
 [2] " 1    2    3    4    5   "
 [3] " The  dog  went to   the "
 [4] "       "                  
 [5] " 6    7    8    9     "   
 [6] " zoo, but  ate  first."   
 [7] "     "                    
 [8] " 10    11    12    13   " 
 [9] " He    likes water a    " 
[10] "     "                    
[11] " 14    15   "             
[12] " bit   too. " 

そして、さらなる改良:

datlines <- gsub("\\[.*\\,.*\\]", "", capture.output( print(datmat, quote=FALSE) ) )
for( i in seq_along(datlines)){ cat(datlines[i], "\n") }
 #----------------------------------#
 1    2    3    4    5    
 The  dog  went to   the  

 6    7    8    9      
 zoo, but  ate  first. 

 10    11    12    13    
 He    likes water a     

 14    15    
 bit   too. 
于 2012-11-06T19:19:27.017 に答える
3

どうですか:

> tmp <- setNames(as.character(dat$text), dat$word.num)
> print(tmp, quote=FALSE)
     1      2      3      4    
 likes  water      a    bit   too.
> options(width = 80)
> print(tmp, quote=FALSE)
     1      2      3      4      5      6      7      8      9     10     11 
   The    dog   went     to    the   zoo,    but    ate first.     He  likes 
    12     13     14     15 
 water      a    bit   too. 

オブジェクトに独自のクラスを貼り付けて、print メソッドを追加できます。

class(tmp) <- "foo"
print.foo <- function(x, quote = FALSE, ...) {
  print(unclass(x), quote = quote, ...)
}
tmp

与える

> tmp
     1      2      3      4      5      6      7      8      9     10     11 
   The    dog   went     to    the   zoo,    but    ate first.     He  likes 
    12     13     14     15 
 water      a    bit   too.

この表現をファイルにダンプする 1 つの方法capture.output()は、 file 引数を持つ を使用することです。

capture.output(tmp, file = "foo.txt")

結果のテキスト ファイルには次のものが含まれます。

$ cat foo.txt 
     1      2      3      4      5      6      7      8      9     10     11 
   The    dog   went     to    the   zoo,    but    ate first.     He  likes 
 water      a    bit   too.
    12     13     14     15 

それはあなたが持っていたものとはまったく異なります - 単語番号は右揃えですが、近いです。

于 2012-11-06T19:27:14.347 に答える
1

スレッドの完全性のために、(関数としての) アプローチは、DWin のソリューションと Gavin のソリューションを少し使用して行いました。

numbtext <- function(text.var, width=80, txt.file = NULL) {
    zz <- matrix(c(1:length(text.var), as.character(text.var) ), 
        nrow=2, byrow=TRUE)
    OW <- options()$width
    options(width=width)
    dimnames(zz) <- list(c(rep("", nrow(zz))), c(rep("", ncol(zz))))
    print(zz, quote = FALSE)
    if (!is.null(txt.file)){
        sink(file=txt.file, append = TRUE) 
        print(zz, quote = FALSE)
        sink()
    }
    options(width=OW)
}

numbtext(dat$text, 40, "foo.txt")

降伏:

 1   2   3    4  5   6    7   8  
 The dog went to the zoo, but ate

 9      10 11    12    13 14  15  
 first. He likes water a  bit too.
于 2012-11-06T22:21:09.927 に答える