将因子转换为日期而不产生NA

时间:2018-10-24 10:28:42

标签: r

首先,我想指出在stackoverflow中提出的其他问题无法将我带到正确的答案。由于不允许对任何问题发表评论,因此我在此处进行此项输入。

head(mw1)
       Datum  Schluss
 1 19.07.2010 1.089,31
 2 19.07.2010 1.093,51
 3 19.07.2010 1.088,38
 4 19.07.2010 1.110,10
 5 19.07.2010 1.117,45
 6 19.07.2010 1.129,74

请注意,mw1$Datum是一个因素,如果我想通过运行as.Date(mw1$Datum)将其转换为日期,则会发生以下错误:

Error in charToDate(x) : 
character string is not in a standard unambiguous format

根据此处提出的其他问题,可能的解决方案可能是:

mw1$Datum <- factor("19.07.2010")
as.Date(mw1$Datum, format = "%d/%m/%y")

但是,它只生成NA而不是正确的日期。 如果有人可以帮助我解决这个问题,我将非常高兴!

最佳 targa

1 个答案:

答案 0 :(得分:1)

让我们逐步进行。

第0步:创建数据框

df <- read.table(header = T, text = "Datum  Schluss
1 19.07.2010 1.089,31
2 19.07.2010 1.093,51
3 19.07.2010 1.088,38
4 19.07.2010 1.110,10
5 19.07.2010 1.117,45
6 19.07.2010 1.129,74")

================================================ =====================

第1步:检查数据

> str(df)
'data.frame':   6 obs. of  2 variables:
 $ Datum  : Factor w/ 1 level "19.07.2010": 1 1 1 1 1 1
 $ Schluss: Factor w/ 6 levels "1.088,38","1.089,31",..: 2 3 1 4 5 6

好的,我们有指定的因素。

================================================ =====================

步骤2:转换日期列

# Read Datum as a date in the specified format and put it back into df.
# %d = day of the month
# %m = month
# %Y = year
# Don't forget the points between the numbers as we have them in the data.
df$Datum <- as.Date(df$Datum, format = "%d.%m.%Y")

再次检查数据:

> str(df)
'data.frame':   6 obs. of  2 variables:
 $ Datum  : Date, format: "2010-07-19" ...
 $ Schluss: Factor w/ 6 levels "1.088,38","1.089,31",..: 2 3 1 4 5 6

好的,现在我们有约会!

================================================ =====================

步骤3:转换数字列

# Remove the 1000's marks
df$Schluss <- gsub("\\.", "", df$Schluss)
# Change decimal commas into points
df$Schluss <- gsub("\\,", "\\.", df$Schluss)
# Convert into numeric
df$Schluss <- as.numeric(df$Schluss)

再次检查数据:

> str(df)
'data.frame':   6 obs. of  2 variables:
 $ Datum  : Date, format: "2010-07-19" ...
 $ Schluss: num  1089 1094 1088 1110 1117 ...

现在它们是数字了!
此视图不会显示小数点后的数字,但请放心,它们仍然存在。

================================================ =====================

步骤3:结果

> df
       Datum Schluss
1 2010-07-19 1089.31
2 2010-07-19 1093.51
3 2010-07-19 1088.38
4 2010-07-19 1110.10
5 2010-07-19 1117.45
6 2010-07-19 1129.74

看上去并没有很大不同,但是现在您可以使用此数据进行进一步的计算和转换。