5

私はいくつかのテキスト処理を行おうとしていますが、ターゲットの単語が新しい変数で特定の方法で識別されるように、文の単語を再コーディングする必要があります。たとえば、次のようなデータフレームがあるとします...

subj <- c("1", "1", "1", "2", "2", "2", "2", "2")
condition <- c("A", "A", "A", "B", "B", "B", "B", "B")
sentence <- c("1", "1", "1", "2", "2", "2", "2", "2")
word <- c("I", "like", "dogs.", "We", "don't", "like", "this", "song.")
d <- data.frame(subj,condition, sentence, word)

 subj condition sentence  word
 1         A        1     I
 1         A        1     like
 1         A        1     dogs.
 2         B        2     We
 2         B        2     don't
 2         B        2     like
 2         B        2     this
 2         B        2     song.

ターゲット単語のすべてのインスタンス(この例では、d $ word = "like"の場合)が0とマークされ、文ブロックの「like」より前のすべての単語が減少し、「のような」増分。各サブジェクトには複数のセンテンスがあり、センテンスは条件によって異なるため、ループでは、サブジェクトごと、センテンスごとにターゲット単語のインスタンスを考慮する必要があります。最終結果は次のようになります。

 subj condition sentence  word   position
 1         A        1     I        -1
 1         A        1     like      0
 1         A        1     dogs.     1
 2         B        2     We       -2
 2         B        2     don't    -1
 2         B        2     like      0
 2         B        2     this      1
 2         B        2     song.     2

質問の言い回しが不十分な場合は申し訳ありませんが、それが理にかなっていることを願っています!ターゲットは、各文の(文の先頭に対して)同じ場所にないことに注意してください。私はRにかなり慣れておらず、インクリメントまたはデクリメントする方法を理解できますが、各文ブロック内で両方を行うことはできません。これについて行くための最良の方法に関する提案はありますか?どうもありがとう!

4

3 に答える 3

5

相対位置に使用できるインデックスを追加できます。
を使用すると、非常に簡単にdata.table分解できますsentence

library(data.table)
DT <- data.table(indx=1:nrow(d), d, key="indx")

DT[, position:=(indx - indx[word=="like"]), by=sentence]

# Results
DT
#    indx subj condition sentence  word position
# 1:    1    1         A        1     I       -1
# 2:    2    1         A        1  like        0
# 3:    3    1         A        1 dogs.        1
# 4:    4    2         B        2    We       -2
# 5:    5    2         B        2 don't       -1
# 6:    6    2         B        2  like        0
# 7:    7    2         B        2  this        1
# 8:    8    2         B        2 song.        2

うだて:

文法的に間違った文がある場合は、grepl代わりに使用することをお勧めします==

DT[, position:=(indx - indx[grepl("like", word)]), by=sentence]
于 2013-03-04T02:10:11.140 に答える
4

テキスト処理では、テキスト入力が要因にならないようにするのが賢明だと思います。この場合、使用as.characterしましたが、設定することをお勧めしますoptions(stringsAsFactors=FALSE)

d$position <- with( d, ave(as.character(word), sentence, 
                               FUN=function(x) seq_along(x) - which(x=="like") ) )
> d
  subj condition sentence  word position
1    1         A        1     I       -1
2    1         A        1  like        0
3    1         A        1 dogs.        1
4    2         B        2    We       -2
5    2         B        2 don't       -1
6    2         B        2  like        0
7    2         B        2  this        1
8    2         B        2 song.        2
于 2013-03-04T02:37:06.173 に答える
3

との慣習的な解決策plyr

 ddply(d, .(subj, condition, sentence), transform, 
   position = seq_along(word) - which(word == 'like'))
于 2013-03-04T03:33:11.513 に答える