0

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

ID 摘要
1 aaaaa。bb。c
2 天。嗯。ff。G。h
3 一世。Ĵ
4 千

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

ID 摘要
1 aaaaa
1 bb
1 c
2 d
2 eee
2 ff
2 g
2 h
3 i
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)  

以下之前的帖子提供了一个很好的解决方案: 在 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)  

但是,当我尝试应用于更大的数据集(> 200,000 行)时,我收到错误消息:
data.frame 中的错误(ID = x$ID,摘要 = 句子):参数暗示不同的行数:1、0

我减少了数据框以在较小的数据集上对其进行测试,但只要行数大于 57,我仍然会收到此错误消息。

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

4

2 回答 2

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 关于 empty 的评论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]
于 2013-05-31T17:52:55.890 回答
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)  

data.tablePS:这与将删除摘要等于''(0个字符)的行的解决方案略有不同。据说我会在这里使用 data.table 解决方案,因为您有超过 200 000 行。

于 2013-05-31T18:01:17.527 回答