【发布时间】:2019-07-31 01:02:28
【问题描述】:
我有一个看起来像这样的数据框:
data <- data.frame(label = c('S', 'SH', 'S', 'S', 'SH'),
word = c('sip', 'shoe', 'plaster', 'reception', 'reception'),
word.segs = c('S IH1 P', 'SH UW1', 'P L AE1 S T AH0', 'R AH0 S EH1 P SH AH0 N', 'R AH0 S EH1 P SH AH0 N'),
seg.index = c(1, 1, 4, 3, 6))
'word.segs' 包含 'word' 列中单词的音标,'seg.index' 中的值是指感兴趣的片段 - 该转录中的第 n 个片段。我想做的是创建两个新列,其中包含 after 这两个段,即 seg.index+1 和 seg.index+2。
我已经在下面的循环中尝试过,它有效,但它需要很长时间(而且我有 100k 行,所以在这里有一个有效的解决方案很重要)
for (x in 1:nrow(data)){
data[x, ]$fol.seg = unlist(data$word.segs[x])[data[x, ]$seg.index+1]
data[x, ]$fol.seg2 = unlist(data$word.segs[x])[data[x, ]$seg.index+2]
}
(请注意,我也尝试过只取消列出一次,将其保存到单独的对象中,然后提取两个感兴趣的值,但这似乎并没有明显更快)
我还在 dplyr 中尝试了另一种方法,希望它可能更有效:
data <- data %>%
mutate(fol.seg = word.segs %>%
strsplit(split = " ") %>%
unlist() %>%
nth(seg.index+1))
但我收到以下错误消息,我不知道为什么它不起作用:
mutate_impl(.data, dots) 中的错误: 评估错误:length(n) == 1 is not TRUE.
任何帮助将不胜感激!
【问题讨论】: