如何将值从另一列R传播到特定组内的空白“”

How to spread the values to blank "" within a specific group from another column R

我查了一些类似的问题给出了方法: 使用 na.strings = ("") > library(zoo) > na.locf() 将空白 "" 转换为 NA 它不适用于如下所示的分组情况

df <- read.table(header = T,text = 'Int.Index Int.Line Name Index Index.Line Amount
       340        1 John   440          1    700
        NA        2 John   440          2    100
        NA        3 John   400          3     50
       450        1  May   500          1   2401
      5694        1 Paul  6023          1   1312
        NA        2 Paul  6023          2   7244
        NA        1 Tom   7889          1    221
        NA        2 Tom   7889          2   2114
        NA        1 Joe    231          1   1349
      3455        1 Ben   3330          1   1353
        NA        2 Ben   3330          2   8651')

目标结果

df_result <- read.table(header = T,text = '
    Int.Index Int.Line Name Index Index.Line Amount
       340        1 John   440          1    700
       340        2 John   440          2    100
       340        3 John   400          3     50
       450        1  May   500          1   2401
      5694        1 Paul  6023          1   1312
      5694        2 Paul  6023          2   7244
        NA        1 Tom   7889          1    221
        NA        2 Tom   7889          2   2114
        NA        1 Joe    231          1   1349
      3455        1 Ben   3330          1   1353
      3455        2 Ben   3330          2   8651')

Tom 组和 Joe 组在没有 $Int.Index 的另一个组之间将被错误地传播应该保持为空白 "" 的值。 $Index 代表组,$Index.Line 显示每个组的行。

根据示例,我们可以按 'Name' 分组,然后执行 fill

library(tidyverse)
df %>%
   mutate(rn = row_number()) %>%
   group_by(Name) %>%
  fill(Int.Index) %>%
  arrange(rn) %>% 
  select(-rn)
# A tibble: 11 x 6
# Groups: Name [6]
#   Int.Index Int.Line Name   Index Index.Line Amount
#       <int>    <int> <fctr> <int>      <int>  <int>
# 1       340        1 John     440          1    700
# 2       340        2 John     440          2    100
# 3       340        3 John     400          3     50
# 4       450        1 May      500          1   2401
# 5      5694        1 Paul    6023          1   1312
# 6      5694        2 Paul    6023          2   7244
# 7        NA        1 Tom     7889          1    221
# 8        NA        2 Tom     7889          2   2114
# 9        NA        1 Joe      231          1   1349
#10      3455        1 Ben     3330          1   1353
#11      3455        2 Ben     3330          2   8651

注意:使用 'Index' 作为组会将第三个观察值归类为一个单独的单元,因为它是 400 而不是 440。