我正在尝试创建一个“day_cent”变量,其中日期以每个ID的最大tn为中心。我写了下面的代码,但是“day_centtn”有大量看似随机的NA,我不明白如何填补空白。
df <- df %>% group_by(id) %>%
mutate(day_centtn = day - day[tn == max])
我的目标是绘制tn vs day_centtn,但此时会出现一个空白网格
p <- ggplot(df, aes(x=day_centtn, y=tn_frac, group=id))
p + geom_line(aes(colour=id)) + geom_point() +
xlim(-5,5) + geom_vline(xintercept = 0) + ylim(0,100))
id day tn max day_centtn tn_frac
1 0 NA 32 NA NA
1 1 32 32 0 100
1 2 27 32 NA 84.375
1 3 13 32 NA 40.625
1 4 NA 32 NA NA
1 5 9 32 NA 28.125
1 6 NA 32 NA NA
1 7 9 32 NA 28.125
1 8 NA 32 NA NA
1 9 NA 32 8 NA
1 10 NA 32 NA NA
1 180 NA 32 NA NA
2 0 NA 9 NA NA
2 1 NA 9 NA NA
2 2 NA 9 NA NA
2 3 8 9 NA 88.8888889
2 4 6 9 -5 66.6666667
2 5 7 9 NA 77.7777778
2 6 7 9 NA 77.7777778
2 7 7 9 NA 77.7777778
2 8 NA 9 NA NA
2 9 9 9 NA 100
2 10 7 9 1 77.7777778
3 0 14 1935-2 0.7235142
3 1 11671935NA 60.3100775
3 2 193519350 100
3 3 10391935NA 53.6950904
3 4 308 19352 15.9173127
3 5 112 1935NA 5.7881137
3 6 103 19354 5.3229974
3 7 76 1935NA 3.9276486
3 8 65 19356 3.3591731
3 9 48 1935NA 2.4806202
3 10 27 19358 1.3953488
非常感谢,Annemarie
答案 0 :(得分:1)
我会首先添加一个列来评估tn是否等于max。在此评估函数中,您可以处理tn中的NA值。这很重要,因为将值与NA进行比较会返回NA(NA == 32返回NA)。
类似的东西:
df %>%
mutate(is_max = ifelse(! is.na(tn), tn == max, FALSE) %>%
group_by(id) %>%
mutate(day_centtn = day - day[is_max])
但是,如果有多个tn值等于id组中的max,则此代码中会出现错误。 如果发生这种情况,这可能会起作用(虽然我没有测试过)。
mutate(day_centtn = day - day[is_max][1])