在 Stata 中,要进行数据筛选(例如使用 `keep`、`drop` 或 `if` 条件),数据需要满足以下基本格式要求:
---
### **1. 数据格式要求**
- **结构化表格**:数据应以典型的 **“长格式”** 或 **“宽格式”** 表格形式组织:
- **每行** 代表一个 **观测(observation)**(例如一个人、一个时间点、一个实验对象)。
- **每列** 代表一个 **变量(variable)**(例如年龄、性别、收入等)。
- 例如:
```stata
+------+--------+--------+
| ID | Gender | Income |
+------+--------+--------+
| 1 | Male | 5000 |
| 2 | Female | 6000 |
+------+--------+--------+
```
- **变量类型正确**:
- 确保变量类型(数值型 `numeric`、字符型 `string`、日期型 `date` 等)与内容匹配。
- 例如:日期应转换为 `%td` 格式,字符变量需用引号筛选(`if Gender == "Female"`)。
- **无合并单元格/标题问题**:
- 如果数据从 Excel 导入,需避免合并单元格或复杂标题,否则可能导致筛选错误。
---
### **2. 常见筛选操作**
#### **方法 1:使用 `keep` 或 `drop`**
```stata
* 保留满足条件的观测(例如:保留女性数据)
keep if Gender == "Female"
* 删除变量(例如:删除 "Income" 列)
drop Income
```
#### **方法 2:使用 `if` 条件**
```stata
* 筛选高收入人群(假设 Income 是数值型)
summarize Income if Income > 10000
* 筛选特定日期之后的数据(日期格式需正确)
list Date if Date > td(01jan2020)
```
#### **方法 3:生成子集**
```stata
* 创建一个新数据集,仅包含筛选后的数据
preserve
keep if Age >= 18 & Age <= 30
save "young_adults.dta", replace
restore
```
---
### **3. 数据导入与清洗**
- **导入外部数据**:
- 使用 `import excel` 或 `import delimited` 导入 Excel/CSV 数据时,确保第一行为变量名,无多余标题。
```stata
import excel "data.xlsx", firstrow clear
```
- **处理缺失值**:
- 使用 `drop if missing(Age)` 删除包含缺失值的观测。
- **类型转换**:
```stata
* 将字符型日期转换为 Stata 日期格式
gen date_num = date(DateString, "YMD")
format date_num %td
```
---
### **4. 常见问题**
- **筛选失败的原因**:
1. 变量类型不匹配(例如:对字符型变量使用数值运算符)。
2. 日期未正确转换为 Stata 日期格式。
3. 数据中存在隐藏字符(如空格),需用 `trim()` 清理:
```stata
replace Gender = trim(Gender)
```
---
### **总结**
Stata 要求数据为 **结构化表格**(行=观测,列=变量),并确保变量类型正确。只要数据格式规范,即可通过 `keep`、`drop` 或 `if` 条件自由筛选。若从外部导入数据,需先清洗和转换格式。