繁体   English   中英

如何根据R中的其他列将NA替换为先前的列值加上一个分组?

[英]How to replace NAs with previous column values plus one by group based on other columns in R?

我目前正在尝试用以前的值加一替换我的数据框中的 NA 值。 但是,存在一个条件,因为这是一个日历年中的周数,因此这些值不得超过 52。 以下是以下数据框的示例:

Animal  Age   Week
Dog     13     5
Dog     14     6
Dog     15     7
Dog     16     NA
Dog     17     NA
Cat     12     46
Cat     13     47
Cat     14     48
Cat     15     49
Cat     16     50
Cat     17     NA
Rat     10     49
Rat     11     50
Rat     12     51
Rat     13     NA
Rat     14     NA
Rat     15     NA
Rat     16     NA
Rat     17     NA

我希望输出的代码如下:

Animal  Age   Week
Dog     13     5
Dog     14     6
Dog     15     7
Dog     16     8
Dog     17     9
Cat     12     46
Cat     13     47
Cat     14     48
Cat     15     49
Cat     16     50
Cat     17     51
Rat     10     49
Rat     11     50
Rat     12     51
Rat     13     52
Rat     14     1
Rat     15     2
Rat     16     3
Rat     17     4

需要注意的是,每只动物的最终年龄总是 17 岁。我尝试使用 R 的函数“完成”和“填充”,但我找不到在第 52 周后重置的情况下添加加一的方法。任何帮助将不胜感激。

对于每个组 ( Animal ),我们将第一个Week数添加到行号并获得余数。 我们最终replace 0 值replace为 52。

library(dplyr)

df %>%
  group_by(Animal) %>%
  mutate(Week = (first(Week) + row_number() - 1) %% 52,
         Week = replace(Week, Week == 0, 52))


#  Animal   Age  Week
#   <fct>  <int> <dbl>
# 1 Dog       13     5
# 2 Dog       14     6
# 3 Dog       15     7
# 4 Dog       16     8
# 5 Dog       17     9
# 6 Cat       12    46
# 7 Cat       13    47
# 8 Cat       14    48
# 9 Cat       15    49
#10 Cat       16    50
#11 Cat       17    51
#12 Rat       10    49
#13 Rat       11    50
#14 Rat       12    51
#15 Rat       13    52
#16 Rat       14     1
#17 Rat       15     2
#18 Rat       16     3
#19 Rat       17     4

同样,在基数 R 中:

df <- transform(df, Week = ave(Week, Animal, FUN = function(x) 
                     seq_along(x) + x[1] - 1 %% 52))
transform(df, Week = replace(Week, Week == 0, 52))

我们可以使用data.table

library(data.table)
setDT(df)[,  Week := (first(Week) + .N - 1) %% 52, Animal][Week == 0, Week := 52][]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM