1

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

4

2 回答 2

6

就像@joran 说的那样,你可以使用sedlike 来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 中完成。

于 2013-10-30T20:34:19.403 回答
1

根据你“进口后”的标准,你的回避apply和家庭条件似乎很随意。我会对你的逻辑感兴趣。

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

  • 创建一个class可供家庭和家庭使用colClasses的新产品。read.table
  • 用于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"

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

gsub("[[:punct:]]", "", as.matrix(df))
#      name    income state
# [1,] "David" "5000" "KS" 
# [2,] "Mark"  "1000" "FL" 
# [3,] "Alice" "5055" "CA" 
于 2013-10-31T17:06:25.140 回答