我在R中有一个时间序列数据帧,其中有一个列V1,该列由整数组成,整个整数散布着一些NA。我想遍历此列,并在以前的一个步骤中从自身减去V1。但是,我想忽略V1中的NA值,并在减法中使用最后一个非NA值。如果V1的当前值为NA,则该差应返回NA。参见下面的示例
ggplot(data = remove_missing(MyData, na.rm = TRUE, vars = the_variable),aes(x= the_variable, fill=the_variable, na.rm = TRUE)) +
geom_bar(stat="bin")
我不希望使用循环来执行此操作,因为我有数百个数据帧,每个数据帧具有10,000行以上。
我解决这个问题的第一个想法是过滤掉NA行,执行迭代差异计算,然后重新插入被过滤掉的行,但是我想不出一种方法。这样做也不是很“整洁”,我不确定它比循环要快。感谢您的任何帮助,如果解决方案使用tidyverse函数,将获得加分。
答案 0 :(得分:3)
dat[!is.na(dat$V1), 'lag_diff'] <- c(NA, diff(dat[!is.na(dat$V1), 'V1']))
# time V1 lag_diff
# 1 1 1 NA
# 2 2 3 2
# 3 3 4 1
# 4 4 NA NA
# 5 5 NA NA
# 6 6 6 2
# 7 7 9 3
# 8 8 NA NA
# 9 9 10 1
或使用data.table
(结果相同)
library(data.table)
setDT(dat)
dat[!is.na(V1), lag_diff := V1 - shift(V1)]
# time V1 lag_diff
# 1: 1 1 NA
# 2: 2 3 2
# 3: 3 4 1
# 4: 4 NA NA
# 5: 5 NA NA
# 6: 6 6 2
# 7: 7 9 3
# 8: 8 NA NA
# 9: 9 10 1
答案 1 :(得分:1)
tidyverse版本,以防万一。它确实需要filter
dat %>%
filter(!is.na(V1)) %>%
mutate(diff=V1- lag(V1)) %>%
right_join(dat,by=c("time","V1"))