我是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
和{{1 }}
(1)var6
是一个虚拟变量,它取每个类别中第一次观察的值1(即由var2
定义的三个组中的每一个),否则为0。
(2)category
是一个虚拟变量,它取每个类别中最后一次观察的值1,否则为0。
(3)var3
计算任何特定观察所属的每组中的观察数量(即,var4
a为3,category
b为4, 3 category
c)
(4)category
记录var5
中每个观察与其上方观察之间的差异
(5)var1
记录var6
中每个观察与其上方观察之间的差异,但仅限于var1
定义的组内。
我对Stata非常了解,我发现使用category
前缀命令并不难做到以上所有事情。例如,bysort
可以轻松生成var1
。但是我在最后一天试图弄清楚如何使用R来解决它们。我确定有几个解决方案(我的朋友参与了bysort category: gen var1=1 if _n==1
包,这似乎比我的一步工资水平)。没有什么比ddplyr
更容易了吗?
最终数据集应如下所示:
bysort
非常感谢您的任何建议。抱歉新手问题;我确信在其他地方已经得到了回答,但是尽管经过了数小时的搜索,我还是找不到它。
答案 0 :(得分:9)
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
答案 1 :(得分:5)
使用dplyr
library(dplyr)
dat <- dat %>%
group_by(category) %>%
mutate(var2 = ifelse(row_number() == 1, 1, 0))%>%
mutate(var3 = ifelse(row_number() == n(), 1, 0)) %>%
mutate(var4 = n()) %>%
mutate(var6 = lag(var1, 1)) %>%
ungroup() %>%
mutate(var5 = lag(var1, 1))