R 通过操纵领先价值填充NAs

R 通过操纵领先价值填充NAs,r,dplyr,R,Dplyr,让我们假设我的数据看起来像下面摘录的前两列(它有更多的观察结果) 我要做的是使用dplyr将每个ID组的所有NA值填充为前导值减1(如在名为value_Filled的列中) 如何操作?您可以使用ifelse语句对新列进行变异,以检查NA值: library(dplyr) df <- structure(list(ID = c(762L, 762L, 763L, 763L, 763L), Value = c(2L, 2L, NA, 8L, 9L)), class = "data.fram

让我们假设我的数据看起来像下面摘录的前两列(它有更多的观察结果)

我要做的是使用dplyr将每个ID组的所有NA值填充为前导值减1(如在名为value_Filled的列中)


如何操作?

您可以使用
ifelse
语句对新列进行
变异,以检查
NA
值:

library(dplyr)

df <- structure(list(ID = c(762L, 762L, 763L, 763L, 763L), Value = c(2L, 
2L, NA, 8L, 9L)), class = "data.frame", row.names = c(NA, -5L
))

df_filled <- df %>% mutate(value_filled = ifelse(is.na(.$Value),as.integer(substr(as.character(.$ID),1,1)),.$Value))
库(dplyr)

df我们可以使用
mutate_at
,包括列以检入
vars
参数,并将每列中的
NA
替换为
lead
值减1

library(dplyr)

df %>%
  group_by(ID) %>% #Maybe you need this, doesn't change anything for this example
  mutate_at(vars(Value, Value_Filled), ~ ifelse(is.na(.), lead(.) - 1, .))

#  ID Value Value_Filled
#1 762     2            2
#2 762     2            2
#3 763     7            7
#4 763     8            8
#5 763     9            9

当然,我的数据帧比这里显示的摘录有更多的观察值,而且我要填充的值也不是所有的值都对应于ID的第一个字符。所以我想我需要一个更具普遍性的解决方案。那么请提供一个可复制的例子。如果有更多条件,您必须检查更多条件。这个解决方案在理论上是可以推广的。但要做到这一点,您需要提供一个描述整个问题的数据集。我的回答回答了你的问题。
library(dplyr)

df %>%
  group_by(ID) %>% #Maybe you need this, doesn't change anything for this example
  mutate_at(vars(Value, Value_Filled), ~ ifelse(is.na(.), lead(.) - 1, .))

#  ID Value Value_Filled
#1 762     2            2
#2 762     2            2
#3 763     7            7
#4 763     8            8
#5 763     9            9