以下是示例数据框:
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之间的差异。对于其他前向差异案例也是如此。
非常感谢!!
答案 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
仅用于理解目的。可以删除这些列。