我对R很陌生,并且已经挣扎了几天来做一些Stata非常简单的事情.朋友给了我一个相对复杂的答案来回答这个问题,但我想知道是否有一个简单的方法可以做到以下几点.
假设我有一个两个变量数据帧,组织如下:
category var1
a 1
a 2
a 3
b 4
b 6
b 8
b 10
c 11
c 14
c 17
Run Code Online (Sandbox Code Playgroud)
我要生成另外五个变量,每个应插入此相同的数据帧:var2
,var3
,var4
,var5
,和var6
(1)var2
是一个虚拟变量,它取每个类别中第一次观察的值1(即,由三个组定义的每一个category
),否则为0.
(2)var3
是一个虚拟变量,它取每个类别中最后一次观察的值1,否则为0.
(3)var4
计算任何特定观察所属的每组中的观察数量(即,3为category
a,4为category
b,3为category
c)
(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
Run Code Online (Sandbox Code Playgroud)
非常感谢任何建议,提前.抱歉新手问题; 我确信在其他地方已经得到了回答,但是尽管经过了数小时的搜索,我还是找不到它.
raw*_*awr 10
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
Run Code Online (Sandbox Code Playgroud)
答案使用 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))
Run Code Online (Sandbox Code Playgroud)