R 导入不带千分隔符的csv,并在不丢失小数点分隔符的情况下从因子转换为数字

R 导入不带千分隔符的csv,并在不丢失小数点分隔符的情况下从因子转换为数字,r,type-conversion,numeric,decimalformat,R,Type Conversion,Numeric,Decimalformat,我有一个包含5列的List data.List,如下所示: Code Price_old MB Price_new Product CZ 898.00 20.00 1.001.00 Type 1 CZ 890.00 300.00 1.016.33 Type 2 CZ 890.00 1.000.00 1.016.63 Type 2 CZ 899.00 200.00 1

我有一个包含5列的List data.List,如下所示:

Code  Price_old MB        Price_new   Product
CZ    898.00    20.00     1.001.00    Type 1
CZ    890.00    300.00    1.016.33    Type 2           
CZ    890.00    1.000.00  1.016.63    Type 2 
CZ    899.00    200.00    1.019.33    Type 2
NO    999.00    50.00     1.025.75    Type 3
NO    999.00    600.00    1.025.75    Type 3
这是直接从.csv导入的。我想知道的是一种将第2列、第3列和第4列从因子转换为数字的方法(因为.numeric(levels(f))[f]不起作用!)(1和5是字符),而不会丢失任何信息

如果(is.factor,as.numeric)使用
mutate\u进行转换,最终会丢失所有小数点:1.025.75->102575、50.00->5000等

使用
sapply进行转换

indx <- sapply(data.list, is.factor)
data.list[indx] <- sapply(data.list[indx], 
                          function(x) as.numeric(as.character(x)))
indx使用来自

基本上,您希望删除除最后一个句点以外的所有句点

csvfile <- 
"Code,Price_old,MB,Price_new,Product
CZ,898.00,20.00,1.001.00,Type 1
CZ,890.00,300.00,1.016.33,Type 2
CZ,890.00,1.000.00,1.016.63,Type 2
CZ,899.00,200.00,1.019.33,Type 2
NO,999.00,50.00,1.025.75,Type 3
NO,999.00,600.00,1.025.75,Type 3"

csvfile <- textConnection(csvfile)

df <- read.csv(csvfile, stringsAsFactors = FALSE)

df[2:4] <- lapply(df[2:4],
                  function(x) as.numeric(gsub("\\.(?=[^.]*\\.)", "", x, perl = TRUE)))

df

csvfile如果在文本编辑器中打开这些数字,它们在csv中的外观如何?我无法想象它会是1.000.00哪个操作系统,你愿意用
awk
和friends来预处理文件?@phiver,它们看起来很普通,因为我想要它们(1025.75)@瓦特钦,我在Windows10上使用R。我不熟悉
awk
在这种情况下,请检查read.csv是否正在执行它应该执行的操作。请尝试
readr
软件包,或者从
data.table
中选择
fread
,或者使用Benjamin提供的解决方案。