0

患者識別子を含むデータセットと、医学的所見の要約を含むテキスト フィールド (患者ごとに 1 行) があります。要約の各文が異なる行に収まるようにテキスト フィールドを分割して、患者ごとに複数の行を持つデータセットを作成したいと考えています。続いて、特定のキーワードと否定語を探して各行をテキスト解析したいと思います。データ フレームの構造の例は次のとおりです (文字は文を表します)。

ID 概要
1 あああああ。bb。c
2 d。ええ。ff。g. h
3 i. じ
4k

「。」でテキストフィールドを分割したいと思います。それを次のように変換します。

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 行) に適用しようとすると、次のエラー メッセージが表示されます

より小さなデータセットでテストするためにデータ フレームを縮小しましたが、行数が 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

empty に関する @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]
于 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 文字) に等しい行を削除するソリューションとは少し異なります。200,000 行を超える行があるため、ここでは data.table ソリューションを使用します。

于 2013-05-31T18:01:17.527 に答える