【问题标题】:Targeted variable recoding in RR中的目标变量重新编码
【发布时间】:2013-02-18 01:29:17
【问题描述】:

我正在尝试进行一些文本处理,并且需要重新编码句子中的单词,以便在新变量中以特定方式识别目标单词。例如,给定一个看起来像这样的数据框...

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 很陌生,可以弄清楚如何增加或减少,但不能在每个句子块中同时做这两件事。关于解决此问题的最佳方法的任何建议?非常感谢!

【问题讨论】:

  • 你如何决定(例如)We 是来自第二个like-2 还是来自第一个like+2
  • @thelatemail,有一个栏目叫sentence ;)
  • @RicardoSaporta - 很好,但如果句子是 I like the way you like to like things.
  • @thelatemail,那么大概需要将句子分成几部分。但是,我猜想在确定相对位置之前会处理这种预处理。另外,我也喜欢你喜欢事物的方式。
  • @thelatemail 这实际上来自实验性操作,所以我们已经考虑到了这一点,但是是的,这不是编写语料库的好方法!

标签: r variables data-manipulation


【解决方案1】:

您可以添加一个索引,然后将其用于相对位置。
使用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]

【讨论】:

  • @alexwhan,我在 SO 上找到了它,这绝对令人难以置信
  • 谢谢,这看起来很棒,除了我不断收到以下错误:[.data.frame(DT, , :=(position, (indx - indx[grepl("like" , : 未使用的参数(by = sentence) 不确定问题可能是什么,因为我完全复制了您的代码...
  • 您是否安装了data.table 包,然后使用library(data.table) 调用它?
  • 我确实这样做了,是的!可能与 d$position 的数据类型有关吗?如果我将其设置为因子或字符,则会出现不同的错误,Combining := in j with by 尚未实现。如果您对此感兴趣,请告诉维护者('data.table')。
  • 嗨@amurphy,听起来您正在使用的数据与上面的类型不同。您能否请dput() 并发布输出 - 您可以在上面编辑您的问题,或者,也许更合适的是,将其作为一个新问题作为后续问题发布,链接回您之前的问题。
【解决方案2】:

我认为在文本处理中避免让您的文本条目成为因素是明智的。在这种情况下,我使用了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

【讨论】:

    【解决方案3】:

    plyr 的常规解决方案

     ddply(d, .(subj, condition, sentence), transform, 
       position = seq_along(word) - which(word == 'like'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      相关资源
      最近更新 更多