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

Import csv without thousand delimiter and convert from factor to numeric without loss of decimal separator

我有一个包含 5 列的列表 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 列从因子转换为数字的方法(as.numeric(levels(f))[f] 不起作用!)(1 和 5 是字符)而不丢失任何信息。

使用 mutate_if(is.factor, as.numeric) 的转换最终丢失了所有小数点: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)))

在我的完整数据集的每一列中通过强制生成大约 200 个 NA,这是我离不开的数据。

其次,我想找到一种解决方案,将所有数值转换为这种格式:“####.##”。

我搜索了很多相关的博客和帖子,但没有找到适合我的问题的解决方案。希望有人有王牌。

干杯

使用来自

的答案

基本上,您想要删除除最后一个句点以外的所有句点。

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