结合名义变量的运行
Combining runs of nominal variables
我有一个数据集,其中包含在聊天会话期间创建的两个人之间的对话。例如,
- "A: Hi"
- "A: How are you today"
- "B: Fine. How are you?"
- "A: I'm good"
- "Cool"
我想在 R 中创建一个简单的函数,它将在 B 说话之前将 A 的行合并为一行,这样我就有了一个如下所示的数据集:
- "A: Hi A: How are you today"
- "B:很好,你好吗?
- "A: I'm good"
- "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"
我有一个数据集,其中包含在聊天会话期间创建的两个人之间的对话。例如,
- "A: Hi"
- "A: How are you today"
- "B: Fine. How are you?"
- "A: I'm good"
- "Cool"
我想在 R 中创建一个简单的函数,它将在 B 说话之前将 A 的行合并为一行,这样我就有了一个如下所示的数据集:
- "A: Hi A: How are you today"
- "B:很好,你好吗?
- "A: I'm good"
- "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"