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