使用 R 和 tidyr() 从 NA 中提取文本

Posted

技术标签:

【中文标题】使用 R 和 tidyr() 从 NA 中提取文本【英文标题】:Extracting text from NAs using R and tidyr() 【发布时间】:2016-01-14 01:22:50 【问题描述】:

我在一个数据框中有四列数据。这些列根据北/南/东/西拆分指定记录(行)是否位于伦敦的 4 个不同部分(没有记录出现在多于一个列中),因此(其中第一行是列标题) :

North    South     East    West
NA       South     NA      NA
NA       NA        East    NA
North    NA        NA      NA

我想将这些用作图表中的一个因素,所以我使用 tidyr 将它们连接起来

LondonNew <- unite(London,"adminarea",North:West,sep="",remove=FALSE)

,所以我现在有一个名为 adminarea 的附加列:

adminarea
NASouthNANA
NANAEastNA
NorthNANANA

我在 tidyr() 中找不到忽略 NA 的参数,我想知道这是否可能?最坏的情况,有人可以帮助我使用一个简单的附加正则表达式/str_extract 来帮助我将 North、South、East 或 West 四个单词提取到单独的列中吗?

目标是:

adminarea
South
East
North

非常感谢您的帮助。

【问题讨论】:

使用 LondonNew$adminarea 在这种情况下它会起作用,但如果文本的其他部分也具有有效的 NA,则并非总是如此。 这是矩阵索引的经典案例 - dat[cbind(seq_len(nrow(dat)),max.col(!is.na(dat)))] 将一次性完成所有 unite 加上 NA 的删除。 另一个选项,如果它适合您的用例,是首先用空字符串替换 NA。示例:London[is.na(London)] &lt;- '' 然后运行 ​​LondonNew &lt;- unite(London,"adminarea",North:West,sep="",remove=FALSE) 【参考方案1】:

尝试使用:

LondonNew$adminarea <- gsub('NA', '', LondonNew$adminarea)

由于组合字符串的特殊性质,这将起作用。如果 NA 是该列中的有效字符序列,则不会。

【讨论】:

以上是关于使用 R 和 tidyr() 从 NA 中提取文本的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 tidyr::replace_na 替换数据框中的所有 NA? [复制]

R:提取具有NA的行,删除那些满足条件A并取那些满足条件B的平均值

小技巧-只删除某一列中含NA的行(R)

R语言使用tidyr包的spread函数将dataframe数据从长表变换为宽表(long format to wide format)

R语言tidyr包spread()函数实战详解:数据裂变从窄表到宽表

使用 R 从搜索结果 URL 中提取文本