【发布时间】:2019-12-16 11:13:28
【问题描述】:
我在 R 中上传了一个 .txt 文件,如下:Election_Parties <- readr::read_lines("Election_Parties.txt") 文件中包含以下文本:pastebin link。
文字大致如下(请使用实际文件解决!):
BOLIVIA
P1-Nationalist Revolutionary Movement-Free Bolivia Movement (Movimiento
Nacionalista Revolucionario [MNR])
P19-Liberty and Justice (Libertad y Justicia [LJ])
P20-Tupak Katari Revolutionary Movement (Movimiento Revolucionario Tupak Katari [MRTK])
COLOMBIA
P1-Democratic Aliance M-19 (Alianza Democratica M-19 [AD-M19])
P2-National Popular Alliance (Alianza Nacional Popular [ANAPO])
P3-Indigenous Authorities of Colombia (Autoridades Indígenas
de Colombia)
我想在一条线上获得有关派对的所有信息,无论它有多长。
期望的输出:
BOLIVIA
P1-Nationalist Revolutionary Movement-Free Bolivia Movement (Movimiento Nacionalista Revolucionario
P19-Liberty and Justice (Libertad y Justicia [LJ])
P20-Tupak Katari Revolutionary Movement (Movimiento Revolucionario Tupak Katari [MRTK])
COLOMBIA
P1-Democratic Aliance M-19 (Alianza Democratica M-19 [AD-M19])
P2-National Popular Alliance (Alianza Nacional Popular [ANAPO])
P3-Indigenous Authorities of Colombia (Autoridades Indígenas de Colombia)
我有一个几乎完全可以解决@JBGruber 的问题的解决方案,可以在here 找到:
lines <- readr::read_lines("https://pastebin.com/raw/jSrvTa7G")
head(lines)
entries <- split(lines, cumsum(grepl("^$|^ $", lines)))
library(stringr)
library(dplyr)
df <- lapply(entries, function(entry) {
entry <- entry[!grepl("^$|^ $", entry)] # remove empty elements
header <- entry[1] # first non empty is the header
entry <- tail(entry, -1) # remove header from entry
desc <- str_extract(entry, "^P\\d+-") # extract description
for (l in which(is.na(desc))) { # collapse lines that go over 2 elements
entry[l - 1] <- paste(entry[l - 1], entry[l], sep = " ")
}
entry <- entry[!is.na(desc)]
desc <- desc[!is.na(desc)]
# turn into nice format
df <- tibble::tibble(
header,
desc,
entry
)
df$entry <- str_replace_all(df$entry, fixed(df$desc), "") # remove description from entry
return(df)
}) %>%
bind_rows() # turn list into one data.frame
但它以某种方式删除了信息。比如这个信息:
P1-Movement for a Prosperous Czechoslovakia (Hnutie za prosperujúce Česko + Slovensko
[HZPČS])
P2-Social Democracy (Sociálna demokracia [SD])
P3-Association for Workers in Slovakia (Združenie robotníkov Slovenska [ZRS])
我对代码的理解不够深入,无法了解删除可能发生的位置,或者如何逐步检查删除发生的位置(因为所有事情都发生在 lapply 内)。有人可以帮忙吗?
请注意,使用data.table 的解决方案同样受欢迎。
编辑:
【问题讨论】:
-
你认为它为什么会删除信息?您上面列出的三个都在
data.frame中。使用grep("Movement for a Prosperous Czechoslovakia", df$entry, value = TRUE)等或在 RStudio Viewer 中进行测试。 -
您链接的文件似乎与原始问题中的不同。答案是基于条目由空行分隔的事实。在这个文件中没有任何空行。由于这个原因,解析会有些不同。
-
@JBGruber 抱歉,我现在已经修改了文件。我已经手动检查了,因为有些东西没有加起来。然后我注意到斯洛文尼亚的前 49 个派对不在那里。我会添加你的建议。
-
嗯,好的。我调整了答案以使用新结构。还要检查答案的最后一段。让我知道还有什么不清楚的地方。
标签: r dplyr data.table stringr readr