首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >复现变量的条件操作

复现变量的条件操作
EN

Stack Overflow用户
提问于 2021-05-03 19:44:24
回答 2查看 45关注 0票数 0

我有以下简化的数据框架。

代码语言:javascript
复制
obj <- data.frame (id = c(1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2),
Date = c("1990-01", "1990-02", "1990-03", "1990-04", "1990-01", "1990-02", "1990-03", "1990-04", "1991-01", "1991-02", "1991-03", "1991-04", "1991-01", "1991-02", "1991-03", "1991-04"),
                   degree = c(1, 1, 1, 2, 1, 1, 0, 0, 1, 2, 2, 2, 1, 1, 2, 1)
)

请注意,我的真实ID名类似于2.01811e+13

我想做的是:

  • I希望创建一个新列,对于degree变为2的日期,该列的值应为1,而对于相同的id,前面的观察值为1。对于每个degree =1时,新列的
  • 应为零。对于任何degree =0时,新列都应采用NA。H 211<degree>H 112对任何其他degree =2(因此,如果先前相同id观察的程度不是1),新列也应该是NA。H 214F 215

请注意,在实际样本中,连续的id观测可能在多年内重叠,例如从1990-11、1990-12、1991-01、1991-02之间的ID。

应该是这样的,

代码语言:javascript
复制
id date    new_col 
1   1990-01   0
1   1990-02   0 
1   1990-03   0
1   1990-04   1
2   1990-01   0
2   1990-02   0
2   1990-03   NA
2   1990-04   NA
1   1991-01   0
1   1991-02   1
1   1991-03   NA
1   1991-04   NA
2   1991-01   0
2   1991-02   0
2   1991-03   1
2   1991-04   0

事先非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-03 20:38:32

使用case_when()的tidyverse选项。

代码语言:javascript
复制
library(dplyr)

obj %>%
  group_by(id) %>%
  mutate(new_col = case_when(degree == 2 & lag(degree) == 1 ~ 1,
                             degree == 1 ~ 0,
                             T ~ NA_real_))

# # A tibble: 16 x 4
# # Groups:   id [2]
#       id Date    degree new_col
#    <dbl> <chr>    <dbl>   <dbl>
# 1      1 1990-01      1       0
# 2      1 1990-02      1       0
# 3      1 1990-03      1       0
# 4      1 1990-04      2       1
# 5      2 1990-01      1       0
# 6      2 1990-02      1       0
# 7      2 1990-03      0      NA
# 8      2 1990-04      1       0
# 9      1 1991-01      2      NA
# 10     1 1991-02      2      NA
# 11     1 1991-03      2      NA
# 12     1 1991-04      2      NA
# 13     2 1991-01      1       0
# 14     2 1991-02      1       0
# 15     2 1991-03      2       1
# 16     2 1991-04      2      NA
票数 2
EN

Stack Overflow用户

发布于 2021-05-04 12:39:12

这是更新的reprex,其中的条件:如果自由度=2和以前的度数=1,那么new_col =1只保留相同的ID。

代码语言:javascript
复制
 obj <- data.frame (id = c(1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2),
    Date = c("1990-01", "1990-02", "1990-03", "1990-04", "1990-01", "1990-02", "1990-03", "1990-04", "1991-01", "1991-02", "1991-03", "1991-04", "1991-01", "1991-02", "1991-03", "1991-04"),
                       degree = c(1, 1, 1, 2, 1, 1, 0, 1, 2, 2, 2, 2, 1, 1, 2, 2)
    )

具有期望的输出

代码语言:javascript
复制
   id date    degree new_col 
    1   1990-01   1     0
    1   1990-02   1     0 
    1   1990-03   1     0
    1   1990-04   2     1
    2   1990-01   1     0
    2   1990-02   1     0
    2   1990-03   0     NA
    2   1990-04   1     0
    1   1991-01   2     NA
    1   1991-02   2     NA
    1   1991-03   2     NA
    1   1991-04   2     NA
    2   1991-01   1     0
    2   1991-02   1     0
    2   1991-03   2     1
    2   1991-04   2     NA

诚挚的问候,

弗雷迪

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67374927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档