空格字符串不能用R中的NA替换

时间:2017-01-08 08:33:57

标签: r dataframe row missing-data

我想用NA代替空格。一个简单的方法可能是df[df == ""] <- NA,这适用于我的数据框的大部分单元格....但不适合所有人!

我有以下代码:

library(rvest)
library(dplyr)
library(tidyr)

#Read website
htmlpage <- read_html("http://www.soccervista.com/results-Liga_MX_Apertura-2016_2017-844815.html")

#Extract table
df <- htmlpage %>% html_nodes("table") %>% html_table()
df <- as.data.frame(df)

#Set whitespaces into NA's
df[df == ""] <- NA

我发现有些空格在引号之间有一点空白

df[11,1] [1] " "

所以我的解决方案是做下一个:df[df == " "] <- NA

然而问题仍然存在,它有一点点空白!我认为修剪功能可以工作,但它没有......

#Trim
df[,c(1:10)] <- sapply(df[,c(1:10)], trimws)

然而,问题无法解决。

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

我们需要使用lapply代替sapply,因为sapply会返回matrix而不是list,这会在引号中产生问题。

df[1:10] <- lapply(df[1:10], trimws)

和另一个选项,如果我们有" "这样的空格,则使用gsub将这些空格替换为""

df[1:10] <- lapply(df[,c(1:10)], function(x) gsub("^\\s+|\\s+$", "", x))

然后将""更改为NA

df[df == ""] <- NA

或者不是做两次替换,我们可以一次性改变class type.convert

df[] <- lapply(df, function(x)
      type.convert(replace(x, grepl("^\\s*$", trimws(x)), NA), as.is = TRUE))

注意:我们不必在所有列循环时指定列索引

答案 1 :(得分:2)

我只是花了一些时间试图确定管道中可用的方法。

这是我的方法:

df <- df %>% 
    dplyr::mutate_all(funs(sub("^\\s*$", NA, .)))

希望这对下一个搜索者有所帮助。