导入没有千分隔符的csv并从因子转换为数字而不丢失小数分隔符

时间:2018-01-22 13:28:06

标签: 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.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,数据我不能没有。

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

我在许多相关的博客和帖子中搜索过,但没有找到解决问题的正确方法。希望有人有一个王牌。

干杯

1 个答案:

答案 0 :(得分:2)

使用https://stackoverflow.com/a/38626760/1017276

的答案

基本上,除了最后一段时间之外,你想删除所有句号。

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