我正在从语言分析软件CLAN中将许多脚本导入R。 CLAN脚本以有关脚本中数据的一些信息开始,并以数据的量化结束。在这之间有一个单词列表。
所以我有这样的东西:
n <-
n word filename
Wed Aug 010427
freq (01-Aug-2018) 010427
ONLY speaker 010427
****** NA 010427
From file 010427
Speaker:*MOT: 010427
1 Al 010427
13 Alex 010427
1 Alex's 010427
2 Bert 010427
---- NA 010427
544 010427
我想提取n == "Speaker:"
和n == "----"
所在行之间的所有数据。我的每个文件都一样。对于这些行,在两点上也word = NA
。
我尝试使用dplyr::filter(ifelse(word %in% "Speaker:":"-----"))
,但也许不用说,那是行不通的。任何其他建议都非常欢迎!
答案 0 :(得分:3)
我建议创建一个新列,以指示该行是否在“扬声器”和“ ----”之间。如果介于此列之间,则该列应为1,否则为0!
df$is_in <- 0
df$is_in[df$n == "Speaker"] <- 1
df$is_in[df$n == "----"] <- -1
df$is_in <- cumsum(df$is_in) # that way it will jump to 1 when "speaker" and to 0 when "----"
df[as.logical(df$is_in),] # will only select you the rows where "is_in" is 1!
要清除仍包含“扬声器”的行,只需df <- df[df$n != "Speaker", ]
。
评论:此解决方案建议“扬声器”和“ ----”在您的数据框中多次出现,假设您的文件名中有一列,则假定为
希望有帮助!
答案 1 :(得分:2)
由于您尝试使用dplyr
解决方案,因此这里是dplyr
解决方案:
df %>% mutate(keep = if_else(n == 'Speaker:',T,NA),
keep = if_else(n == '----',F,keep)) %>%
fill(keep, .direction='down') %>%
filter(n != 'Speaker:', keep ==T)
首先,它创建一个列,以标记是否应保留数据(T / F),并以“ Speaker:”开始,以“ ----”结束。然后,它会过滤掉我们未标记为保留的数据以及“发言人:”行本身。
答案 2 :(得分:1)
假设您已成功将其导入为数据框:
first_row = which(your_data$n == "Speaker:")
last_row = which(your_data$n == "-----")
result = your_data[first_row:last_row, ]
如果您不希望这些行包含在结果中,则可以使用(first_row + 1):(last_row - 1)
。
与tobiaspk1的更一般的答案不同,这仅在“发言人”和“ -----”行唯一的情况下有效。
答案 3 :(得分:0)
变化形式:
library(dplyr)
df %>%
filter(row_number() > which(n == "Speaker:") & row_number() < which(n == "----"))
# n word filename
# 1 1 Al 010427
# 2 13 Alex 010427
# 3 1 Alex's 010427
# 4 2 Bert 010427