我有一个数据集,其中包含在聊天会话期间创建的两个人之间的对话框。例如,
我想在R中创建一个简单的函数,在B说出一行之前将A的行组合起来,这样我就有了一个看起来像这样的数据集:
我知道如何合并/组合单元格,但我不知道如何创建逻辑语句为A之前的A语言创建指示符(反之亦然)。
答案 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")