R语言 如何将年龄替换为先前值+1

velaa5lx  于 2022-12-06  发布在  其他
关注(0)|答案(5)|浏览(111)

我试图通过在前一波的值上加1来替换一波中缺失的年龄值,例如:
| 识别码|年龄|波浪形|
| - -|- -|- -|
| 一个|二十个|一个|
| 一个|不适用|2个|
| 2个|六十一|一个|
| 2个|不适用|2个|
会变成
| 识别码|年龄|波浪形|
| - -|- -|- -|
| 一个|二十个|一个|
| 一个|二十一个|2个|
| 2个|六十一|一个|
| 2个|六十二|2个|

ztmd8pv5

ztmd8pv51#

library(tidyverse)

df %>% 
  mutate(Age = case_when(is.na(Age) ~ lag(Age) + 1, 
                         TRUE ~ Age))

# A tibble: 4 x 3
     ID   Age  Wave
  <dbl> <dbl> <dbl>
1     1    20     1
2     1    21     2
3     2    61     1
4     2    62     2
sdnqo3pr

sdnqo3pr2#

基准R

> ave(df$Age,df$ID,FUN=function(x){x[1]+seq_along(x)-1})
[1] 20 21 61 62
1tu0hz3e

1tu0hz3e3#

使用tidyverse,假设您的数据位于df Dataframe 中:

library(tidyverse)

df %>% 
    group_by(ID) %>% arrange(ID, Wave) %>%
    mutate(missing_grp = cumsum( (is.na(Age)!=is.na(lag(Age))) | !is.na(Age) )) %>%
    group_by(ID, missing_grp) %>%
    mutate(age_offset=cumsum(is.na(Age))) %>%
    group_by(ID) %>%
    fill(Age, .direction='down') %>%
    mutate(Age = Age + age_offset) %>%
    ungroup() %>% select(-missing_grp, -age_offset)

它也适用于多个连续缺失的年龄。对于以下输入:

df <- tribble(
    ~ID, ~Age, ~Wave,
    1,   21,    1,
    1,   NA,    2,
    2,   61,    1,
    2,   NA,    2,
    2,   NA,    3,
    2,   70,    4,
    2,   NA,    5,
    )

它返回:

# A tibble: 7 × 3
     ID   Age  Wave
  <dbl> <dbl> <dbl>
1     1    21     1
2     1    22     2
3     2    61     1
4     2    62     2
5     2    63     3
6     2    70     4
7     2    71     5
b4lqfgs4

b4lqfgs44#

以R为基数

within(df, Age[is.na(Age)] <- Age[which(is.na(Age)) - 1] + 1)
#>   ID Age Wave
#> 1  1  20    1
#> 2  1  21    2
#> 3  2  61    1
#> 4  2  62    2
t3irkdon

t3irkdon5#

如果有两个以上的波,我们可以使用行号:

library(dplyr)
library(tidyverse)

df |>
  group_by(ID) |>
  fill(Age) |>
  mutate(Age = Age + row_number() - 1) |>
  ungroup()

输出量:

# A tibble: 5 × 3
     ID   Age  Wave
  <dbl> <dbl> <dbl>
1     1    21     1
2     1    22     2
3     2    61     1
4     2    62     2
5     2    63     3

相关问题