R 导入csv后,从csv中删除所有标点符号
假设我有一个包含以下数据的数据帧(df):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 = 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内部完成这一操作—这是一种多么新颖的方法。非常有趣,谢谢+这是一种多么新颖的方式啊。非常有趣,谢谢!