R 多列上的多个子()条件
我正在尝试使用sub()执行查找和替换,并将其应用于多列 我的数据集与此类似:R 多列上的多个子()条件,r,R,我正在尝试使用sub()执行查找和替换,并将其应用于多列 我的数据集与此类似: > mydata col1 col2 col3 col4 1 1 $1.40 $5.39 $23.42 2 2 $(2.40) $(38.29) $(1,239.30) 3 3 $1,302.00 $102.32 $23.10 具有多个以传统会计格式表示的数字字段 我尝试编写以下函数来交换括号负数、千位分隔符和美元数
> mydata
col1 col2 col3 col4
1 1 $1.40 $5.39 $23.42
2 2 $(2.40) $(38.29) $(1,239.30)
3 3 $1,302.00 $102.32 $23.10
具有多个以传统会计格式表示的数字字段
我尝试编写以下函数来交换括号负数、千位分隔符和美元数字
find_replace <- function(df, cols){
df[, cols] <- sub('\\,','',df[, cols])
df[, cols] <- sub('\\$','',df[, cols])
df[, cols] <- sub('\\-','',df[, cols])
df[, cols] <- sub('\\(','-',df[, cols])
df[, cols] <- sub('\\)','',df[, cols])
df[, cols] <- as.numeric(df[, cols])
}
mydata[,2:4] <- lapply(mydata[,2:4], find_replace(mydata, 2:4))
当我试着在我的实际数据集上运行它时(将它应用于6列和大约480万行),它会挂起,必须在我得到错误之前停止操作,但我可以想象它是一样的
如果所有字段都是数字字段,那么有没有关于以以下方式结束的有效方法的建议?在csv中读取时,我也尝试过使用colClass参数和SetClass函数,类似于这种方法,但没有成功
> mydata
col1 col2 col3 col4
1 1 1.40 5.39 23.42
2 2 -2.40 38.29 -1239.30
3 3 1302.00 102.32 23.10
提前谢谢你
编辑:再次尝试setClass选项,并使用@waterling中的正则表达式:
setClass("acntngFmt")
# [1] "acntngFmt"
setAs("character", "acntngFmt",
function(from) as.numeric(gsub("(?![.])[[:punct:]]", "", col, perl=TRUE, from)))
Input <- "A, B, C
$1.40, $(2.40), $1,302.00
$5.39, $(38.29), $102.32
$23.42, $(1,239.30), $23.10"
DF <- read.csv(textConnection(Input), header = TRUE,
colClasses = c("acntngFmt", "acntngFmt", "acntngFmt"))
Error in as.character(x) :
cannot coerce type 'closure' to vector of type 'character'
setClass(“acntngFmt”)
#[1]“acntngFmt”
setAs(“字符”,“acntngFmt”,
函数(from)为.numeric(gsub((?![.])[[:punct:][],“”,col,perl=TRUE,from)))
输入首先将前括号转换为减号,然后删除所有逗号、右括号和美元符号
setClass("acntngFmt")
setAs("character", "acntngFmt",
function(from) as.numeric( gsub("[$),]", "", gsub("\\(", "-", from))))
DF <- data.frame( lapply(mydata[2:4], as, "acntngFmt"))
#---------------
DF
col2 col3 col4
1 1.4 5.39 23.42
2 -2.4 -38.29 -1239.30
3 1302.0 102.32 23.10
我认为这是一个重复:我编辑了这个问题,将其包括在内。我以前试过,但没有成功。我认为正则表达式是错误的。似乎你能够通过改进正则表达式部分使它工作?您将如何编辑它以将“$(2.40)”替换为-2.40?偏执表示一个负数。
df<-data.frame(V1=c("$1.40","$(2.40)","$(1,302.00)"), V2=c("$5.39","$(38.29)","$0.00"))
V1 V2
1 $1.40 $5.39
2 $(2.40) $(38.29)
3 $(1,302.00) $0.00
apply(df, 2, function(col) as.numeric(gsub("(?![.])[[:punct:]]", "", col, perl=TRUE)))
V1 V2
[1,] 1.4 5.39
[2,] 2.4 38.29
[3,] 1302.0 0.00
apply(df, 2, function(col) {
as.numeric(
gsub("\\((.*)\\)","-\\1",
gsub("(?![.\\(\\)])[[:punct:]]", "", col, perl=TRUE)
)
)
})
V1 V2
[1,] 1.4 5.39
[2,] -2.4 -38.29
[3,] -1302.0 0.00
setClass("acntngFmt")
setAs("character", "acntngFmt",
function(from) as.numeric( gsub("[$),]", "", gsub("\\(", "-", from))))
DF <- data.frame( lapply(mydata[2:4], as, "acntngFmt"))
#---------------
DF
col2 col3 col4
1 1.4 5.39 23.42
2 -2.4 -38.29 -1239.30
3 1302.0 102.32 23.10
mydata <-
structure(list(col1 = 1:3, col2 = structure(c(3L, 1L, 2L), .Label = c("$(2.40)",
"$1,302.00", "$1.40"), class = "factor"), col3 = structure(c(3L,
1L, 2L), .Label = c("$(38.29)", "$102.32", "$5.39"), class = "factor"),
col4 = structure(c(3L, 1L, 2L), .Label = c("$(1,239.30)",
"$23.10", "$23.42"), class = "factor")), .Names = c("col1",
"col2", "col3", "col4"), class = "data.frame", row.names = c("1",
"2", "3"))