导入后从csv中删除所有标点符号

时间:2013-10-30 19:57:17

标签: r csv

假设我有一个包含以下数据的数据框(df):

df = data.frame(name=c("David","Mark","Alice"),
income=c("5,000","10,00","$50.55"),
state=c("KS?","FL","CA;"))

我想集体删除此数据框中的所有标点符号。当然,我可以将每列作为单独的向量并在其上运行gsub命令(见下文),但我想删除整个数据框中的所有标点符号。

gsub("[?.;!¡¿·']", "", df$state)

有没有办法在R中指定它而不编写for循环或使用apply函数将函数应用于每个数据框列?

2 个答案:

答案 0 :(得分:6)

就像@joran说的那样,你可以sed喜欢s使用你想要摆脱的标点符号...

#  Writing your data out to a file
write.table( df , "~/input.txt" , sep = "\t" )

#  Reading it back in again, sans punctuation
read.table( pipe( paste0( "sed s'/[[:punct:]]//g' /Users/Simon/input.txt" ) ) , head=TRUE)
#   name income state
#1 David   5000    KS
#2  Mark   1000    FL
#3 Alice   5055    CA

sed在读入R时逐行处理您的文件。使用[[:punct:]] regexp类将确保您确实删除所有标点符号。

它可以完全在R. Lovely。

中完成

答案 1 :(得分:1)

根据您的“导入后”标准,您避免apply和家人的条件似乎非常随意。我会对你的逻辑感兴趣。

无论如何,在您已经导入了符合您特殊条件的数据之后,这里有一个解决问题的替代方法:

  • 创建一个class colClasses可以在read.table及其家人中使用。{/ li>
  • 使用do.call(paste, ...)将现有的data.frame折叠为以制表符分隔的字符向量。
  • 重新读取该字符向量,此时指定colClasses

以上为例:

setClass("spc")           ## Strip punctuation and return a character vector
setAs("character", "spc", function(from) 
  gsub("[[:punct:]]", "", from))
setClass("spn")           ## Strip punctuation and return a numeric vector
setAs("character", "spn", function(from) 
  as.numeric(gsub("[[:punct:]]", "", from)))

## Use those `class`es in `colClasses`
out2 <- read.delim(text = do.call(paste, c(df, sep = "\t")), 
                   header = FALSE, colClasses = c("spc", "spn", "spc"))
str(out2)
# 'data.frame':  3 obs. of  3 variables:
#  $ V1: chr  "David" "Mark" "Alice"
#  $ V2: num  5000 1000 5055
#  $ V3: chr  "KS" "FL" "CA"

或者,如果任何表格形式就足够了,您可以将数据转换为matrix并在其上使用gsub

gsub("[[:punct:]]", "", as.matrix(df))
#      name    income state
# [1,] "David" "5000" "KS" 
# [2,] "Mark"  "1000" "FL" 
# [3,] "Alice" "5055" "CA"