具有缺失值的行之间的向前和向后差异

时间:2018-02-15 20:59:18

标签: r

以下是示例数据框:

df <- data.frame(
 id = c("A", "A", "A", "A", "B", "B", "B", "B"), 
 num = c(1, NA, 6, 3, 7, NA , NA, 2))

如何在id类别的行之间获得前后差异?应该有两个新列:当前raw和previous之间的一个区别,另一个应该是当前raw和next raw之间的差异。如果前一个raw是NA,那么它应该计算当前行和包含实数的第一个原始raw之间的差异。对于其他前向差异案例也是如此。

非常感谢!!

2 个答案:

答案 0 :(得分:1)

require(magrittr)

df$backdiff <- c(NA, sapply(2:nrow(df), 
                            function(i){
                                df$num[i] - df$num[(i-1):1] %>% .[!is.na(.)][1]
                            }))

df$forward.diff <- c(sapply(2:nrow(df) - 1, 
                            function(i){
                                df$num[i] - df$num[(i+1):nrow(df)] %>% .[!is.na(.)][1]
                            }), NA)

答案 1 :(得分:0)

使用required_fields = [f for f in MyModel._meta.get_fields() if not getattr(f, 'blank', False) is True] 中的fill函数创建两个列(每个列用于上一个和下一个计算)可以实现一个解决方案,其中tidyr值被删除。

NA

注意: OP需要澄清的查询很少。之后可以对解决方案进行微调。 df <- data.frame( id = c("A", "A", "A", "A", "B", "B", "B", "B"), num = c(1, NA, 6, 3, 7, NA , NA, 2)) library("tidyverse") df %>% mutate(dup_num_prv = num, dup_num_nxt = num) %>% group_by(id) %>% fill(dup_num_prv, .direction = "down") %>% fill(dup_num_nxt, .direction = "up") %>% mutate(prev_diff = ifelse(is.na(num), NA, num - lag(dup_num_prv))) %>% mutate(next_diff = ifelse(is.na(num), NA, num - lead(dup_num_nxt))) %>% as.data.frame() # Result is shown in columns 'prev_diff' and 'next_diff' # id num dup_num_prv dup_num_nxt prev_diff next_diff #1 A 1 1 1 NA -5 #2 A NA 1 6 NA NA #3 A 6 6 6 5 3 #4 A 3 3 3 -3 NA #5 B 7 7 7 NA 5 #6 B NA 7 2 NA NA #7 B NA 7 2 NA NA #8 B 2 2 2 -5 NA dup_num_prv仅用于理解目的。可以删除这些列。