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

R 导入csv后,从csv中删除所有标点符号,r,csv,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) 有没有一种方法

假设我有一个包含以下数据的数据帧(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函数将函数应用于每个数据帧列?

就像@joran所说的,您可以使用
sed
Like来
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时逐行处理文件。使用
[[:punt:]
regexp类将确保确实删除所有标点符号


这完全可以在R.Lovely内完成。

就像@joran说的,你可以使用
sed
Like来
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时逐行处理文件。使用
[[:punt:]
regexp类将确保确实删除所有标点符号

这完全可以在R.Lovely内完成。

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

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

  • 创建一个新的
    ,可供
    read.table
    和族中的
    colClasses
    使用
  • 使用
    do.call(粘贴,…)
    将现有的
    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"
根据您的“导入后”标准,您避免
apply
和family的条件似乎非常随意。我对你的逻辑很感兴趣

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

  • 创建一个新的
    ,可供
    read.table
    和族中的
    colClasses
    使用
  • 使用
    do.call(粘贴,…)
    将现有的
    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"

如果要避免在列上循环,在将文件导入R之前使用命令行工具(如
sed
)可能会更容易。甚至可以使用
system()
从R内部执行此操作。如果要避免在列上循环,在将文件导入R之前,使用命令行工具(如
sed
)可能会更容易。甚至可以使用
system()
+1从R内部完成这一操作—这是一种多么新颖的方法。非常有趣,谢谢+这是一种多么新颖的方式啊。非常有趣,谢谢!