【发布时间】:2014-10-06 06:35:22
【问题描述】:
我对 R 非常陌生,并且已经努力了几天来做一些 Stata 非常简单的事情。有朋友给了我这个问题比较复杂的答案,但我想知道是否有一种简单的方法可以做到以下几点。
假设我有一个两个变量的数据框,组织如下:
category var1
a 1
a 2
a 3
b 4
b 6
b 8
b 10
c 11
c 14
c 17
我想生成五个额外的变量,每个变量都应该插入到同一个数据框中:var2、var3、var4、var5 和 var6
(1) var2 是一个虚拟变量,每个类别(即category 定义的三个组中的每一个)中的第一个观察值取值为 1,否则取值为 0。
(2) var3 是一个虚拟变量,每个类别的最后一次观察取值为 1,否则取值为 0。
(3) var4 计算任何特定观察所属的每个组中有多少观察(即,category a 为 3,category b 为 4,category c 为 3 )
(4) var5 记录var1 中的每个观察值与它上面的观察值之间的差异
(5) var6 记录var1 中的每个观察值与其上方的观察值之间的差异,但仅限于category 定义的组内。
我对 Stata 相当熟悉,并且我发现使用 bysort 前缀命令完成以上所有操作并不难。例如,var1 很容易由bysort category: gen var1=1 if _n==1 生成。但是最后一天我一直在努力弄清楚如何使用 R 来解决这些问题。我确信有几种解决方案(我的朋友参与了 ddplyr 包,这似乎比我的工资等级高了一步) .有没有像bysort 这样简单的事情?
最终的数据集应该如下所示:
category var1 var2 var3 var4 var5 var6
a 1 1 0 3 n/a n/a
a 2 0 0 3 1 1
a 3 0 1 3 1 1
b 4 1 0 4 1 n/a
b 6 0 0 4 2 2
b 8 0 0 4 2 2
b 10 0 1 4 2 2
c 11 1 0 3 1 n/a
c 14 0 0 3 3 3
c 17 0 1 3 3 3
非常感谢您提前提出的任何建议。对不起菜鸟问题;我确信这在其他地方得到了回答,但是尽管搜索了几个小时,我还是找不到它。
【问题讨论】:
-
Meta-comment 作为一个有经验的 Stata 用户和一个非常偶然的 R 用户:我认为在 R 中做某事总是有一种聪明的方法,但没有规定它看起来像Stata 解决方案。
-
在 Stata 中
bysort category: gen var1 = 1 if _n==1不会产生 0 或 1 的指标变量(在您的术语中是虚拟的),但会产生缺失或 1 的指标。为此,您需要bysort category: gen var1 = _n==1。