我想用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)
然而,问题无法解决。
有什么想法吗?
答案 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, .)))
希望这对下一个搜索者有所帮助。