结合名义变量的运行

时间:2015-02-15 13:29:12

标签: r string concatenation

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

  1. " A:嗨"
  2. " A:今天你好吗"
  3. " B:很好。你好吗?"
  4. " A:我很好"
  5. "酷"
  6. 我想在R中创建一个简单的函数,在B说出一行之前将A的行组合起来,这样我就有了一个看起来像这样的数据集:

    1. " A:你好A:你今天过得怎么样?#34;
    2. " B:好吧,你好吗?
    3. " A:我很好"
    4. " B:酷"
    5. 我知道如何合并/组合单元格,但我不知道如何创建逻辑语句为A之前的A语言创建指示符(反之亦然)。

2 个答案:

答案 0 :(得分:10)

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"   

答案 1 :(得分:3)

使用data.table的选项。将向量(&#34; v1&#34;)转换为data.table(setDT)。根据前缀(&#34; A&#34;,&#34; B&#34;)创建一个新变量(&#34; indx&#34;)。使用rleid创建分组变量,paste使用&#34; V1&#34;变量(没有前缀)和&#34; indx&#34;创造预期的产出。

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来分割列&#34; V1&#34;分为两个(&#34; V1&#34;和&#34; V2&#34;),按rleid分组&#34; V1&#34;和paste&的内容#34; V1&#34;和&#34; V2&#34;。

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")