通过在R中拆分文本数据,在数据框中将每一个主题的一行转换为多行

时间:2013-05-31 17:37:07

标签: r text

我有一个带有患者标识符的数据集和一个带有医学发现摘要的文本字段(每位患者1行)。我想通过拆分文本字段来创建每个患者多行的数据集,以便摘要的每个句子都落在不同的行上。随后,我想通过文本解析每一行寻找某些关键词和否定词。数据框结构的一个例子是(字母代表句子):

ID摘要
1 aaaaa。 BB。 ç
2 d。 EEE。 FF。 G。 ^ h
3我Ĵ
4 k

我想将文本字段拆分为“。”以将其转换为:

ID摘要
1 aaaaa
1 bb
1 c
2 d
2 eee
2 ff
2克
2小时 3我 3 j
4 k

用于创建初始数据框的R代码:

ID <- c(1, 2, 3, 4)  
Summary <- c("aaaaa. bb. c", "d. eee. ff. g. h", "i. j", "k")  

df <- data.frame(cbind(ID, Summary))  
df$ID <- as.numeric(df$ID)  
df$Summary <- as.character(df$Summary)  

以下上一篇文章提供了一个很好的解决方案: Breaking up (melting) text data in a column in R?

我使用了以下适用于此示例数据集的发布代码:

dflong <- by(df, df$ID, FUN = function(x) {  
  sentence = unlist(strsplit(x$Summary, "[.]"))  
  data.frame(ID = x$ID, Summary = sentence)  
  })  
dflong2<- do.call(rbind,dflong)  

但是,当我尝试应用于我的较大数据集(&gt; 200,000行)时,收到错误消息:
data.frame中的错误(ID = x $ ID,摘要=句子):参数意味着行数不同:1,0

我缩小了数据框以在较小的数据集上对其进行测试,并且在行数> 57时仍然会收到此错误消息。

还有另一种可以处理更多行的方法吗?任何建议表示赞赏。谢谢。

2 个答案:

答案 0 :(得分:3)

使用data.table

library(data.table)
dt = data.table(df)

dt[, strsplit(Summary, ". ", fixed = T), by = ID]
#    ID    V1
# 1:  1 aaaaa
# 2:  1    bb
# 3:  1     c
# 4:  2     d
# 5:  2   eee
# 6:  2    ff
# 7:  2     g
# 8:  2     h
# 9:  3     i
#10:  3     j
#11:  4     k

有很多方法可以解决@ agstudy关于空Summary的评论,但这里有一个很有趣的方法:

dt[, c(tmp = "", # doesn't matter what you put here, will delete in a sec
                 # the point of having this is to force the size of the output table
                 # which data.table will kindly fill with NA's for us
       Summary = strsplit(Summary, ". ", fixed = T)), by = ID][,
       tmp := NULL]

答案 1 :(得分:1)

您收到错误,因为对于某些行,您没有数据(摘要列)。试试这个应该适合你:

   dflong <- by(df, df$ID, FUN = function(x) {  
      sentence = unlist(strsplit(x$Summary, "[.]"))  
      ## I just added this line to your solution
      if(length(sentence )==0)
           sentence <- NA
      data.frame(ID = x$ID, Summary = sentence)  
    })  
   dflong2<- do.call(rbind,dflong)  

PS:这与data.table解决方案略有不同,后者将删除摘要等于''(0 charcaters)的行。这就是说我会在这里使用data.table解决方案,因为你有超过200 000行。