本文介绍了寻找在R中执行Stata的By Sort任务的直接方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我对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为SO3,category
b为4,category
c为3)
(4)var5
记录var1
中的每个观测值与其上方的观测值之间的差异
(5)var6
记录var1
中的每个观测与其上方的观测之间的差异,但仅在category
定义的组内。
我非常熟悉Stata,并且我发现使用bysort
prefix命令来完成上面的所有操作并不困难。例如,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
非常感谢您提前提出任何建议。对于菜鸟的问题,我很抱歉;我相信这个问题已经在其他地方得到了答案,但我找了好几个小时也没能找到它。
推荐答案
dat <- read.table(header = TRUE,
text =
'category var1
a 1
a 2
a 3
b 4
b 6
b 8
b 10
c 11
c 14
c 17')
(dat <- within(dat, {
var6 <- ave(var1, category, FUN = function(x) c(NA, diff(x)))
var5 <- c(NA, diff(var1))
var4 <- ave(var1, category, FUN = length)
var3 <- rev(!duplicated(rev(category))) * 1
var2 <- (!duplicated(category)) * 1
}))
# category var1 var2 var3 var4 var5 var6
# 1 a 1 1 0 3 NA NA
# 2 a 2 0 0 3 1 1
# 3 a 3 0 1 3 1 1
# 4 b 4 1 0 4 1 NA
# 5 b 6 0 0 4 2 2
# 6 b 8 0 0 4 2 2
# 7 b 10 0 1 4 2 2
# 8 c 11 1 0 3 1 NA
# 9 c 14 0 0 3 3 3
# 10 c 17 0 1 3 3 3
这篇关于寻找在R中执行Stata的By Sort任务的直接方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!