结合名义变量的运行

Combining runs of nominal variables

我有一个数据集,其中包含在聊天会话期间创建的两个人之间的对话。例如,

  1. "A: Hi"
  2. "A: How are you today"
  3. "B: Fine. How are you?"
  4. "A: I'm good"
  5. "Cool"

我想在 R 中创建一个简单的函数,它将在 B 说话之前将 A 的行合并为一行,这样我就有了一个如下所示的数据集:

  1. "A: Hi A: How are you today"
  2. "B:很好,你好吗?
  3. "A: I'm good"
  4. "B: Cool"

我知道如何合并/合并单元格,但我不确定如何创建逻辑语句,为 A 在 B 之前说的台词创建指示符(反之亦然)。

使用 data.table 的选项。将向量 ("v1") 转换为 data.table (setDT)。根据前缀("A"、"B")创建一个新变量("indx")。使用 rleid 创建分组变量,并使用 "indx" paste "V1" 变量(不带前缀)的内容来创建预期的输出。

library(data.table)#data.table_1.9.5
setDT(list(v1))[, indx:=sub(':.*', '', V1)][, paste(unique(indx), 
   paste(sub('.:', '', V1), collapse=" "), sep=":") , rleid(indx)]$V1
# [1] "A: Hi  How are you today" "B: Fine. How are you?"   
# [3] "A: I'm good"              "B: Cool"                 

或者变体将使用 tstrsplit 将列 "V1" 拆分为两个("V1" 和 "V2"),按 rleid 分组"V1" 和 paste "V1" 和 "V2" 的内容。

setDT(list(v1))[,tstrsplit(V1, ": ")][, sprintf('%s: %s', unique(V1),
           paste(V2, collapse=" ")), rleid(V1)]$V1
#[1] "A: Hi How are you today" "B: Fine. How are you?"  
#[3] "A: I'm good"             "B: Cool"   

或使用 base R

的选项
 str1 <- sub(':.*', '', v1)
 indx1 <- cumsum(c(TRUE,indx[-1]!=indx[-length(indx)]))
 str2 <- sub('.*: +', '', v1)
 paste(tapply(str1, indx1, FUN=unique),
    tapply(str2, indx1, FUN=paste, collapse=" "), sep=": ")
 #[1] "A: Hi How are you today" "B: Fine. How are you?"  
 #[3] "A: I'm good"             "B: Cool"   

数据

v1 <- c("A: Hi" , "A: How are you today", "B: Fine. How are you?", 
     "A: I'm good" ,"B: Cool")

rle() 函数可用于此目的。它确定给定向量中所有 等值。

v1 <- c("A: Hi" , "A: How are you today", "B: Fine. How are you?", 
     "A: I'm good" ,"B: Cool") # input data

speakers <- rle(substring(v1, 1, 1))

rle() 函数的输出现在可用于 相应地拆分 对话部分,然后将它们组合起来以获得所需的结果。

ids <- rep(paste(1:length(speakers$lengths)), speakers$lengths) 
unname(sapply(split(v1, ids), function(monologue) {
   # concatenate all statements in a "monologue"
   monologue[-1] <- substring(monologue[-1], 4)
   paste(monologue, collapse=" ")
}))

结果:

## [1] "A: Hi How are you today"
## [2] "B: Fine. How are you?"
## [3] "A: I'm good"             
## [4] "B: Cool"