我需要将每个人的年份直接置于空值(具有年份值的最早文件日期)之上,然后用该年份填充缺失的值.我有一个使用子集设置和分配值的方法,但它需要循环数据,并且对于数十亿行来说,这是不可行的.下面是一个模拟数据集,显示了数据的 struct .每个ID都有多个文件日期,并且可能有几年与之关联.对于3/1/14之前的文件日期,年份列缺失.

df <- data.frame(
   ID = c(1,1,1,1,1,1,2,2,2,2),
   file_date = c("12/1/14", "9/1/14", "6/1/14", "3/1/14", "12/1/13", "9/1/13", "9/1/14", "6/1/14", "3/1/14", "12/1/13"),
   year = c(1979, 1965, 1965, 1965, NA, NA, 1982, 1982, 1982, NA)
)

在此数据中,前两个空值将用1965填充,最后一个空值将用1982填充.

推荐答案

由于无法使用tidyr::fill(),因此可以使用avetry 以下方法.

如果您可以访问zoo套餐,这很简单:

# zoo::na.locf
df$Filled_Year_zoo <- ave(df$year, df$ID, FUN = zoo::na.locf0) # thanks to @G. Grothendieck

如果不是,完全基于R的方法可能是:

### Full base R
df$Filled_Year_base <- ave(df$year, df$ID,
                           FUN = \(x) {
                             x[which(is.na(x))] <- tail(x[which(!is.na(x))], 1)
                             x})

结果:

#    ID file_date year Filled_Year_zoo Filled_Year_base
# 1   1   12/1/14 1979            1979             1979
# 2   1    9/1/14 1965            1965             1965
# 3   1    6/1/14 1965            1965             1965
# 4   1    3/1/14 1965            1965             1965
# 5   1   12/1/13   NA            1965             1965
# 6   1    9/1/13   NA            1965             1965
# 7   2    9/1/14 1982            1982             1982
# 8   2    6/1/14 1982            1982             1982
# 9   2    3/1/14 1982            1982             1982
# 10  2   12/1/13   NA            1982             1982

(您当然可以覆盖year列,我只是定义新列以供演示)

R相关问答推荐

R -列表元素中所有命名项的总和

将一个载体的值相加,直到达到另一个载体的值

在数据表中呈现数学符号

在垂直轴中包含多个ggplot2图中的平均值

多重RHS固定估计

手动打印线型gplot

我不能在docker中加载sf

在另一个函数中调用ggplot2美学

迭代通过1个长度的字符串长字符R

无法正确设置动态创建的Quarto标注的格式

仅 Select 超过9行的CSV文件

在保留列表元素属性的同时替换列表元素

来自程序包AFEX和amp;的类/函数和NICE_TABLE&冲突

创建列并对大型数据集中的特定条件进行成对比较的更高效程序

生存时间序列的逻辑检验

roxygen2正在处理太多的文件

隐藏基于 case 总数的值

策略表单连接两个非常大的箭头数据集,而不会 destruct 内存使用

如何在R中的两列以上使用联合(&U)?

无法保存gglot的所有pdf元素