从 R 中的整个数据框中删除特殊字符
Remove special characters from entire dataframe in R
问题:
如何使用 R 快速高效地从数据框中删除所有特殊字符?
进度:
此 SO post 详细说明了如何删除特殊字符。我可以将 gsub 函数应用于单个列(图像 1 和 2),但不能应用于整个数据框。
问题:
我的数据框由 100 多列整数、字符串等组成。当我尝试 运行 数据框上的 gsub 时,它没有 return 我想要的输出。相反,我得到了图 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)
df - 这是原始数据框:
dfa - 这是应用于 b 列的 gsub。好!
df_all - 这是应用于整个数据帧的 gsub。不好!
总结:
有没有办法对整个数据帧进行 gsub?否则,是否应该改用应用函数?
这是一个使用 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
另一种解决方案是先将数据帧转换为矩阵,然后 运行 gsub,然后再转换回数据帧,如下所示:
as.data.frame(gsub("[[:punct:]]", "", as.matrix(df)))
我喜欢 Ryan 使用 dplyr 的回答。由于 mutate_all
和 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:]]", "", .)))
a b c
1 1 fefa
2 2 fes
3 3 gDEEwfseges gdgd
问题:
如何使用 R 快速高效地从数据框中删除所有特殊字符?
进度:
此 SO post 详细说明了如何删除特殊字符。我可以将 gsub 函数应用于单个列(图像 1 和 2),但不能应用于整个数据框。
问题:
我的数据框由 100 多列整数、字符串等组成。当我尝试 运行 数据框上的 gsub 时,它没有 return 我想要的输出。相反,我得到了图 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)
df - 这是原始数据框:
dfa - 这是应用于 b 列的 gsub。好!
df_all - 这是应用于整个数据帧的 gsub。不好!
总结:
有没有办法对整个数据帧进行 gsub?否则,是否应该改用应用函数?
这是一个使用 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
另一种解决方案是先将数据帧转换为矩阵,然后 运行 gsub,然后再转换回数据帧,如下所示:
as.data.frame(gsub("[[:punct:]]", "", as.matrix(df)))
我喜欢 Ryan 使用 dplyr 的回答。由于 mutate_all
和 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:]]", "", .)))
a b c
1 1 fefa
2 2 fes
3 3 gDEEwfseges gdgd