前言

自学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等懒人专用的商业软件喜欢用。对于RPython编程,这种结构一看就显得莫名其妙,显得很不严谨。故更推荐用括号指定的方式,比如byte(age)或者float(height score)。这里,height和socre两个变量之间又没逗号分隔。完了,用Python的眼光看Stata,真是有点不顺眼。



. input str20 name byte(age) float(height score) //从命令窗口输入。得到以下结果

                     name       age     height      score
  1.





python在一个数组后面接上另一个素组 python如何在数组中取值_Python


接着,直接从命令窗口直接录入一条观测数据,如上图所示。这里要注意:

  • 各变量数据之间用空格隔开。按Enter键录入一条数据
  • 如果想一次录入多条数据,用Ctrl+Enter键进行换行
  • 输入字符型数据比如人名Steph的时候,用英文单引号'Steph',而不是双引号(Python可以混用)
  • end命令,表示录入结束


python在一个数组后面接上另一个素组 python如何在数组中取值_数据_02


此时,我们已经在Stata内存用拥有了一个数据框(借助R和Python的数据格式概念,就是数据表的意思)。如果我们想

  • 增加一个新的变量,则先输入input weight(默认类型是浮点型),再录入新的数据。这里注意结果窗口的编号。表示观测值的索引(第几个观测值)


python在一个数组后面接上另一个素组 python如何在数组中取值_Python_03


  • 增加一条数据,则先输入input命令,再录入数据


python在一个数组后面接上另一个素组 python如何在数组中取值_数据_04


当然,用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


python在一个数组后面接上另一个素组 python如何在数组中取值_Python_05


1.2 在数据编辑窗口

这个是鼠标点击编辑模式,简单易学。鼠标+键盘可以录入数据,修改变量的属性,大家试试就会了。界面大致如下图。


python在一个数组后面接上另一个素组 python如何在数组中取值_python写byte数组到文件_06


python在一个数组后面接上另一个素组 python如何在数组中取值_Python_07


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文件如下图:


python在一个数组后面接上另一个素组 python如何在数组中取值_数据_08


## 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自带的数据集。