在Stata中模仿_n以在R

时间:2018-07-17 18:28:08

标签: r dataframe stata tidyverse

我有一个看起来像这样的数据集:

fact_code style_serial
1004      style_101
1004      style_101
1004      style_101
1004      style_102
1004      style_102
1004      style_102
5002      style_101
5002      style_101
5002      style_101
5002      style_102
5002      style_102
5002      style_102

其中fact_code是工厂代码,style_serial是工厂生产的服装样式的序列号。我试图生成的是一个变量ss,看起来像这样:

fact_code style_serial ss
1004      style_101    1
1004      style_101    0
1004      style_101    0
1004      style_102    1
1004      style_102    0
1004      style_102    0
5002      style_101    1
5002      style_101    0
5002      style_101    0
5002      style_102    1
5002      style_102    0
5002      style_102    0

基本上,该变量ss可以由Stata代码生成,如下所示:

bysort fact_code style_serial: gen ss=_n==1

_n是当前观测编号的Stata表示法。

但是我试图使用R生成相同的伪变量ss,但会不断出错。这些是我试图模仿上述Stata代码的R代码:

mydf <- mydf %>% 
  group_by(fact_code, style_serial) %>% 
  mutate(ss = n_distinct(fact_code, style_serial))

mydf <- mydf %>% group_by(fact_code, style_serial) %>% 
  mutate(ss =  ave(mydf$fact_code, mydf$style_serial, FUN = seq_along))

R数据帧的名称为mydf

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

您可以使用duplicated()

df1$ss <- with(df1, ifelse(duplicated(df1), 0, 1))

产量

> df1
   fact_code style_serial ss
1       1004    style_101  1
2       1004    style_101  0
3       1004    style_101  0
4       1004    style_102  1
5       1004    style_102  0
6       1004    style_102  0
7       5002    style_101  1
8       5002    style_101  0
9       5002    style_101  0
10      5002    style_102  1
11      5002    style_102  0
12      5002    style_102  0

数据

df1 <- read.table(header=TRUE, text="fact_code style_serial
1004      style_101
                  1004      style_101
                  1004      style_101
                  1004      style_102
                  1004      style_102
                  1004      style_102
                  5002      style_101
                  5002      style_101
                  5002      style_101
                  5002      style_102
                  5002      style_102
                  5002      style_102")