我的几个文档通过RStudio作为PDF输出,.Rnw
脚本,knitr
和LaTeX
都有冗长的索引。 readLines
可以读入R
每个文档的索引(" file.ind"文件),并将它们全部合并到一个字符向量中。
向量如下所示,但PDF文档缩进\ item项下的\ subitem术语(我称之为' Secondary'术语)(我称之为'主要'术语) )。合并后的矢量包含20多个主要术语(例如数据和统计)和2,000个辅助术语(例如'分布,钟形曲线,正常,20) 。主要术语可以包含5到50+次要术语。
\item Data
\subitem distribution, bell curve, normal, 20
\subitem absolute number, 111
\subitem arithmetic mean, 21
\subitem big data, 137
\subitem binary, 110
\subitem categorical, 130
\item Statistics
\subitem count, 53
\subitem data, 53, 129
\subitem data, missing, 135
\subitem digits, 53
编程挑战是"填写"主要术语,直到下一个主要术语开始,然后填写第二个主要术语,直到下一个术语开始,依此类推。或者,R
如何使用两列创建一个看起来像这样的对象?
Primary Secondary
Data distribution, bell curve, normal, 20
Data absolute number, 111
Data arithmetic mean, 21
Data big data, 137
Data binary, 110
Data categorical, 130
Statistics count, 53
Statistics data, 53, 129
Statistics data, missing, 135
Statistics digits, 53
我的目标是在Excel中保存修改后的组合索引,以便我可以更轻松地标准化命名约定,检测缺失的术语,修复拼写错误等。
感谢您提供任何指导。
答案 0 :(得分:0)
我认为以下内容应该有效(完全未经测试,但大多数测试过)。您可以逐行读取输入文件,然后处理两种类型的输入:
\item
开头
\subitem
开头
df <- data.frame(Primary=character(),
Secondary=character(),
stringsAsFactors=FALSE)
# replace 'filepath' with the actual path to your file
con = file(filepath, "r")
primary <- NA
secondary <- NA
while (TRUE) {
line <- readLines(con, n=1)
if (length(line) == 0) {
break
}
if (substr(line, 2, 5) == 'item') {
primary <- gsub("\\\\item\\s+(.*)", "\\1", line)
}
else if (substr(line, 2, 8) == 'subitem') {
secondary <- gsub("\\\\subitem\\s+(.*)", "\\1", line)
df$Primary <- primary
df$Secondary <- secondary
}
else {
print(paste0("Unexpected input: ", line))
}
}
close(con)
请注意,如果您不知道文件的实际路径是什么,那么只需在Windows资源管理器中查找该文件并复制该路径即可。在Linux上,您可以查找该文件,或查找其位置并键入pwd
。
<强>更新强>
根据您的评论,听起来好像您向我们展示的数据已经在角色向量中。您可以将上面的内容简化为以下内容:
primary <- NA
secondary <- NA
for (i in 1:length(IndxAll)) {
line <- IndxAll[i]
if (length(line) == 0) {
break
}
if (substr(line, 2, 5) == 'item') {
primary <- gsub("\\\\item\\s+(.*)", "\\1", line)
}
else if (substr(line, 2, 8) == 'subitem') {
secondary <- gsub("\\\\subitem\\s+(.*)", "\\1", line)
df$Primary <- primary
df$Secondary <- secondary
}
else {
print(paste0("Unexpected input: ", line))
}
}