我试图通过在前一波的值上加1来替换一波中缺失的年龄值,例如:| 识别码|年龄|波浪形|| - -|- -|- -|| 一个|二十个|一个|| 一个|不适用|2个|| 2个|六十一|一个|| 2个|不适用|2个|会变成| 识别码|年龄|波浪形|| - -|- -|- -|| 一个|二十个|一个|| 一个|二十一个|2个|| 2个|六十一|一个|| 2个|六十二|2个|
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
sdnqo3pr2#
基准R
> ave(df$Age,df$ID,FUN=function(x){x[1]+seq_along(x)-1}) [1] 20 21 61 62
1tu0hz3e3#
使用tidyverse,假设您的数据位于df Dataframe 中:
df
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
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
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
5条答案
按热度按时间ztmd8pv51#
sdnqo3pr2#
基准R
1tu0hz3e3#
使用tidyverse,假设您的数据位于
df
Dataframe 中:它也适用于多个连续缺失的年龄。对于以下输入:
它返回:
b4lqfgs44#
以R为基数
t3irkdon5#
如果有两个以上的波,我们可以使用行号:
输出量: