我想从numeric
变量创建一个string
变量:
06-08-2003
30-02-1934
19-11-1923
29-12-1945
12-04-1997
这是我previous posts之一的string
变量dates
中的值。
我尝试使用encode
命令,但当我尝试sort
生成的date
变量时,它无法按预期工作。
我做错了什么?有可能这样做吗?
答案 0 :(得分:3)
您似乎想要将string
变量转换为numeric
变量。但是,不应使用命令encode
来执行此操作。
由于@Nick Cox有commented before:
" ...我们应该强调编码对于转换来说是一个非常非常糟糕的主意 日期字符串到数字日期变量。考虑一个带字符串的最小数据集 20apr2018和28mar1952应该很明显,这些将被编码为 1和2,因为编码使用字典规则,以便" 20"之前排序" 28"。所以 结果'日期'甚至没有正确的顺序。问题是阴险的 大多数时候,用户会看到看起来很好的价值标签,但是 在数值下面几乎总是纯垃圾。"
为了说明这一点,请考虑自己的例子:
clear
input str10 string
"06-08-2003"
"30-02-1934"
"19-11-1923"
"12-04-1997"
"29-12-1945"
end
encode string, generate(numeric)
sort numeric
list
+-------------------------+
| string numeric |
|-------------------------|
1. | 06-08-2003 06-08-2003 |
2. | 12-04-1997 12-04-1997 |
3. | 19-11-1923 19-11-1923 |
4. | 29-12-1945 29-12-1945 |
5. | 30-02-1934 30-02-1934 |
+-------------------------+
你的新" date"变量未按预期排序,
是因为它本质上是一个通用numeric
变量,每个值附加value label
:
list, nolabel
+----------------------+
| string numeric |
|----------------------|
1. | 06-08-2003 1 |
2. | 12-04-1997 2 |
3. | 19-11-1923 3 |
4. | 29-12-1945 4 |
5. | 30-02-1934 5 |
+----------------------+
为了创建包含日期的有效numeric
变量,您需要执行的操作是使用date()
或等效的daily()
函数进行正确的转换:
drop numeric
generate numeric = date(string, "DMY")
format %tddd-NN-YY numeric
list
+-----------------------+
| string numeric |
|-----------------------|
1. | 06-08-2003 6-08-03 |
2. | 12-04-1997 12-04-97 |
3. | 19-11-1923 19-11-23 |
4. | 29-12-1945 29-12-45 |
5. | 30-02-1934 . |
+-----------------------+
sort numeric
list
+-----------------------+
| string numeric |
|-----------------------|
1. | 19-11-1923 19-11-23 |
2. | 29-12-1945 29-12-45 |
3. | 12-04-1997 12-04-97 |
4. | 06-08-2003 6-08-03 |
5. | 30-02-1934 . |
+-----------------------+
请注意,30-02-1934
不是有效日期,因此也是相应的观察结果
numeric
变量中缺少。