通过在R中拆分文本数据,将数据帧中每个主题的一行转换为多行
我有一个带有患者标识符的数据集和一个带有医疗发现摘要的文本字段(每个患者一行)。我想通过拆分文本字段创建一个每个患者有多行的数据集,以便摘要的每个句子都位于不同的行上。随后,我将对每一行进行文本分析,查找某些关键字和否定词。数据框的结构示例如下(字母代表句子): ID摘要通过在R中拆分文本数据,将数据帧中每个主题的一行转换为多行,r,text,R,Text,我有一个带有患者标识符的数据集和一个带有医疗发现摘要的文本字段(每个患者一行)。我想通过拆分文本字段创建一个每个患者有多行的数据集,以便摘要的每个句子都位于不同的行上。随后,我将对每一行进行文本分析,查找某些关键字和否定词。数据框的结构示例如下(字母代表句子): ID摘要 1 aaaaa。bb。c 二维。伊伊。ff。Gh 3 i。j 4K 我想在“.”处拆分文本字段,将其转换为: ID摘要 1 aaaaa 1 bb 1c 2d 2 eee 2 ff 2g 2小时 3我 3 j 4K 用于创建初始
1 aaaaa。bb。c
二维。伊伊。ff。Gh
3 i。j
4K 我想在“.”处拆分文本字段,将其转换为: ID摘要
1 aaaaa
1 bb
1c
2d
2 eee
2 ff
2g
2小时
3我
3 j
4K 用于创建初始数据帧的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)
ID使用数据。表
:
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对空摘要的评论,但这里有一个有趣的方法:
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]
使用数据。表:
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对空摘要的评论,但这里有一个有趣的方法:
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]
由于某些行没有数据(摘要列),因此会出现错误。试试看,这应该对你有用:
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)
dflong您会收到一个错误,因为对于某些行,您没有数据(摘要列)。试试看,这应该对你有用:
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)
d昨天发布了一个几乎相同的问题。我还没有找到帖子,但这看起来很相似:昨天发布了一个几乎相同的问题。还没有找到帖子,但这看起来很相似:我运行它得到了一个不同的结果——它也只有拆分的第一个元素。对于我来说,它似乎截断了第一个元素之外的所有内容。但是,您提出了一个关于空数据的好观点,以及为什么我会出现错误。data.table解决方案运行良好。谢谢。@SteveB我编辑了我的答案。它应该是if
和else
而不是ifelse
。它现在可以工作了,谢谢!运行这个程序我得到了一个不同的结果——它也只有split的第一个元素,它似乎截断了第一个元素之外的所有元素。但是,您提出了一个关于空数据的好观点,以及为什么我会出现错误。data.table解决方案运行良好。谢谢。@SteveB我编辑了我的答案。它应该是if
和else
而不是ifelse
。它现在可以工作了,谢谢!这很好用,谢谢你的帮助!这很好用,谢谢你的帮助!