在R

时间:2018-08-08 15:05:42

标签: r

我正在从语言分析软件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:":"-----")),但也许不用说,那是行不通的。任何其他建议都非常欢迎!

4 个答案:

答案 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