从 R 中的整个数据框中删除特殊字符

Piz*_*ode 5 r data-cleaning data-science

问题:

如何使用 R 快速高效地从数据框中删除所有特殊字符?

进步:

这篇 SO文章详细介绍了如何删除特殊字符。我可以将 gsub 函数应用于单列(图像 1 和 2),但不能应用于整个数据帧。

问题:

我的数据帧由 100 多列整数、字符串等组成。当我尝试在数据帧上运行 gsub 时,它不会返回我想要的输出。相反,我得到了图 3 中所示的内容。

df <- read.csv("C:/test.csv")
dfa <- gsub("[[:punct:]]", "", df$a) #this works on a single column
dfb <- gsub("[[:punct:]]", "", df$b) #this works on a single column
df_all <- gsub("[[:punct:]]", "", df) #this does not work on the entire df
View(df_all)
Run Code Online (Sandbox Code Playgroud)

df - 这是原始数据框:

原始数据框

dfa - 这是应用于 b 列的 gsub。好的!

gsub 应用于 b 列

df_all - 这是应用于整个数据帧的 gsub。坏的!

gsub 应用于整个数据帧

概括:

有没有办法 gsub 整个数据帧?否则,应该使用 apply 函数吗?

Rya*_*yan 6

这是使用 dplyr 的可能解决方案:

# Example data
bla <- data.frame(a = c(1,2,3), 
              b = c("fefa%^%", "fes^%#$%", "gD%^E%Ewfseges"), 
              c = c("%#%$#^#", "%#$#%@", ",.,gdgd$%,."))

# Use mutate_all from dplyr
bla %>%
  mutate_all(funs(gsub("[[:punct:]]", "", .)))

  a           b    c
1 1        fefa     
2 2         fes     
3 3 gDEEwfseges gdgd
Run Code Online (Sandbox Code Playgroud)

更新:

mutate_all已被取代,并且从 dplyr 0.8.0 开始funs弃用。mutate这是使用和的更新解决方案across

# Example data
df <- data.frame(a = c(1,2,3), 
                 b = c("fefa%^%", "fes^%#$%", "gD%^E%Ewfseges"), 
                 c = c("%#%$#^#", "%#$#%@", ",.,gdgd$%,."))

# Use mutate_all from dplyr
df %>%
  mutate(across(everything(), ~gsub("[[:punct:]]", "", .x)))
Run Code Online (Sandbox Code Playgroud)


Gor*_*way 3

另一种解决方案是先将数据帧转换为矩阵,然后运行 ​​gsub,然后转换回数据帧,如下所示:

as.data.frame(gsub("[[:punct:]]", "", as.matrix(df))) 
Run Code Online (Sandbox Code Playgroud)