前言
自学Stata/Python/R的时候,跑模型啊、试命令啊,第一步是干嘛?找个数据呗~!
搞数据最简单的方法有3种,一是原始的手工录入;二是读入系统自带的数据;三就是读入现成的数据。今天我们先介绍第一种,手动从键盘录入数据。
好玩的是,今天,我们新三大统计软件Stata/Python/R
的手工录入数据一起学!(Btw,老三大叫SPSS/SAS/Stata
)
1 Stata 手动录入数据
1.1 在互动命令窗口录入
使用的是Stata的 input
命令。语法如下:
input [varlist] [, automatic label]
说明:在变量名字之前可以指定变量的类型,比如下面的 name
变量,其数据类型是str20
。指定的方式又可以分为三种,大家具体参考下面代码一看就懂。
然后,这里顺便吐槽一下Stata
第一种指定变量的方式。比如str20 name
,这种参数空格变量的方式,也就是Stata和SAS等懒人专用的商业软件喜欢用。对于R
和Python
编程,这种结构一看就显得莫名其妙,显得很不严谨。故更推荐用括号指定的方式,比如byte(age)
或者float(height score)
。这里,height和socre两个变量之间又没逗号分隔。完了,用Python的眼光看Stata,真是有点不顺眼。
. input str20 name byte(age) float(height score) //从命令窗口输入。得到以下结果
name age height score
1.
接着,直接从命令窗口直接录入一条观测数据,如上图所示。这里要注意:
- 各变量数据之间用空格隔开。按
Enter
键录入一条数据 - 如果想一次录入多条数据,用
Ctrl+Enter
键进行换行 - 输入字符型数据比如人名
Steph
的时候,用英文单引号'Steph'
,而不是双引号(Python可以混用) - 以
end
命令,表示录入结束
此时,我们已经在Stata内存用拥有了一个数据框(借助R和Python的数据格式概念,就是数据表的意思)。如果我们想
- 增加一个新的变量,则先输入
input weight
(默认类型是浮点型),再录入新的数据。这里注意结果窗口的编号。表示观测值的索引(第几个观测值)
- 增加一条数据,则先输入input命令,再录入数据
当然,用do来录入是一个更明智的做法。完整命令如下:
.input str20 name byte(age) float(height score)
"Steph" 32 1.92 97
.end
.input weight
.90
.end
.input
."LeBron" 36 2.06 99 120
.end
1.2 在数据编辑窗口
这个是鼠标点击编辑模式,简单易学。鼠标+键盘可以录入数据,修改变量的属性,大家试试就会了。界面大致如下图。
2 Python手动录入数据
2.1 屏幕输入函数
和Stata的input
命令类似的,Python有一个专用的通过键盘和屏幕录入数据的input函数
。不过input函数一次只能录入一个结果,且默认是字符串。如果想一次性录入一条观测值,则可以考虑一次性录入完整的一条字符串,然后通过分割函数将结果转换,然后赋值给对应的变量。除了input函数,Python还有另外一个功能更多的sys包中的sys.stdin函数
。然而这两个函数都是面向传统开发,而不是数据科学,因此通常不推荐使用。
2.2 NumPy二维数组
- 相对而言,Python在代码中录入数据更为灵活,也更为常用。代码具体的实现方法包括通过NumPy包,简单的直接赋值给一个数据二维的数组。
import numpy as np ##导入NumPy包
Xs = np.array([['Steph', 32, 1.92, 97],
['LeBron', 36, 2.06, 99]])
Xs
Out[8]:
array([['Steph', '32', '1.92', '97'],
['LeBron', '36', '2.06', '99']], dtype='<U6')
需要注意的是,这个只是数组,也就数据表(框)的数据主体,并没有包含变量(列)的名称。所以,这当然不是我们想要的。
2.3 pandas数据框
正确的方法应该是使用pandas包(暂时忘了NumPy吧)。pandas
可以“精细化”地处理二维的数据表格,让用户更加深入地了解数据框的结构。
import pandas as pd ##导入pandas包
data = {'name': ['Steph', 'LeBron'], ##用字典的方式,完成数据一列一列的输入
'age': [32, 36 ],
'height': [1.92, 2.06],
'score': [97, 99]}
labels = ['a', 'b']
df1 = pd.DataFrame(data, index=labels) ##用列表labels的取值来当成每行的索引
df1
Out[9]:
name age height score
a Steph 32 1.92 97
b LeBron 36 2.06 99
##添加新行(新的观测值)
df1.loc['c'] = ['Harden', '32', 1.96, 98]
df1
Out[10]:
name age height score
a Steph 32 1.92 97
b LeBron 36 2.06 99
c Harden 32 1.96 98
2.4 open函数:在Python代码中逐个元素写入/读出csv文件
在练习Python算法和数据结构的时候,我们可能不止需要将数据临时保存在列表、字典或者数据框中,还可能需要将他们逐个元素写到一个文档中(如csv,至于将内存中的整个数据保存到csv或者xlsx中是一个非常常规的数据保存操作,这里不讨论)。回到逐个元素的读写。
## 使用open函数的with...as结构来写
data = [[1,2,3],[4,5,6]]
with open(r'd:data.csv', 'w') as fp:
for line in data:
ok = fp.write('%sn'%','.join([str(item) for item in line]))
新生成的csv文件如下图:
## with...as从csv文件中逐个读取数据
numlist = list()
with open(r'd:data.csv', 'r') as fp: ##r = read, 表示读出数据
for line in fp.readlines():
numlist.append([int(f) for f in line.strip().split(',')])
numlist
Out[39]: [[1, 2, 3], [4, 5, 6]]
3 R语言的手动录入数据
RStudio里面数据框查看器好像是不能编辑变量和数据的。那就好好写代码吧。
> library(dplyr) # 能整理数据框的R包很多。这里我们使用dplyr
> ##一个变量 = 一列 = 一个向量
> name <- c("Steph","LeBron")
> age <- c(32, 36)
> height <- c(1.92,2.06)
> score <- c(97,99)
> df1 <- data.frame(name, age, height, score) ##行的名称使用了默认的数字编码
> df1
name age height score
1 Steph 32 1.92 97
2 LeBron 36 2.06 99
> df1 <- df1 %>% add_row(name="Harden", age=32, height=1.96, score=98) ##增加一个新行
> df1
name age height score
1 Steph 32 1.92 97
2 LeBron 36 2.06 99
3 Harden 32 1.96 98
> df1$weight <- c(90, 110, 100) ##增加一个新列。用了最简单的方法
> df1
name age height score weight
1 Steph 32 1.92 97 90
2 LeBron 36 2.06 99 110
3 Harden 32 1.96 98 100
4 小结:
- 虽说Stata没有Python和R那么细致严谨,但用起来效率最高啊
- Python的优点R也有,毕竟人家是统计之王嘛。它俩有些地方类似,比如逐列录入、定义行和列的索引
最后:手工录入的数据简单快捷,但是毕竟还是太原始。那。。。有什么有高级且快捷的嘛?当然有咯。其实文章开头我们已经提到了——导入软件自带的案例数据。
好了,下一步,哦不,是下一篇文章,我们将介绍如何导入Stata/Python/R自带的数据集。