如何删除 R 向量中空格之前或之后的元素



我有大约 200 个.txt的歌词文件,格式与此类似

Useless info
useless info

First Verse
First Verse
Second Verse
Second Verse

useless info

我想将它们全部读入 R 以进行一些文本挖掘。我的想法是用readLines读出它们,然后在第一个和最后一个空白行之前从该向量中删除元素。这就是我目前所拥有的。

lines <- readLines(txtfile)
lines
> "Useless info" "useless info" "" "" "First Verse" "First Verse" 
> "" "" "Second Verse" "Second Verse" "" "" "useless info"

如果我要对解决方案进行硬编码,我只会lines[5:6,8:9]元素并将其分配给一个新变量,但由于歌词有时有两节,有时有三节,我希望有一个解决方案可以去掉第一个双"之前和最后一个双"之后的元素">

如果我做错了,有人有更好的主意,我也很乐意听到!

更新:"无用的信息">

行并不是字面意思是"无用的信息",它们是歌词和标签的文件路径,所以出于分析原因,它们对我来说毫无用

在基本 R 中:

sapply(strsplit(paste(lines, collapse = "&esc;"), "(&esc;){2,3}"), 
function(x) paste0(gsub("&esc;", "n", x[-c(1, length(x))]), collapse = "nn"))
# [1] "First VersenFirst VersennSecond VersenSecond Verse"

当打印或写入文本文件时,会给出

First Verse
First Verse
Second Verse
Second Verse

我们可以创建一个分组变量,rleid

library(data.table)
lst1 <- split(lines, rleid(nzchar(lines)))
lst2 <- lst1[-c(1, length(lst1))]
out  <- unlist(lst2[sapply(lst2, function(x) all(nzchar(x)))], use.names = FALSE)
out
#[1] "First Verse"  "First Verse"  "Second Verse" "Second Verse"

数据

lines <- c("Useless info", "useless info", "", "", "First Verse", "First Verse", 
"", "", "Second Verse", "Second Verse", "", "", "useless info"
)

最好的解决方案可能取决于你的进一步处理方式,例如,你是否想保留经文信息(@akrun的rleid在那里会很有用(,将所有内容折叠成一个字符串,等等。 根据文件布局,您可以删除第一个非空元素和最后一个元素,然后删除介于两者之间的所有空元素:

# optional: read file _textfile_ with `data.table::fread`
lines <- data.table::fread(text="textfile", header=FALSE, sep=NULL, colClasses='character')$V1
first.empty <- which(!nzchar(lines))[1] # determine where to start
lines <- lines[first.empty:(length(lines)-1)] # also remove last element
lines <- lines[nzchar(lines)] # remove empty elements
lines
# or with `magrittr` pipe:
lines[first.empty:(length(lines)-1)] %>% .[nzchar(.)]

相关内容

最新更新